C# 类成员函数指针和 C++ this->*func



我正在将一个C++项目移植到C#,但遇到了一个this->函数指针。在C++中运行良好:

class ModbusData {
bool ScannAll(void (ModbusData::*func)(MBSFrame *Frame), MBSFrame *Frame)
{
if (Frame->MatchAddress(MyBaseAddr, MySize)) {
(this->*func) (Frame);
return true;
} else {
if (NextData != 0) {
return NextData->ScannAll(func, Frame);
}
return false;
}
}

};

//该函数的用法如下

gCoils->ScannAll(&ModbusData::ReadMultiple, Frame);

这是我的C#atrempt:

class ModbusData {
public delegate void ModDataFunc(MBSFrame Frame);
public bool ScannAll(ModDataFunc func, MBSFrame Frame)
{
if (Frame.MatchAddress(MyBaseAddr, MySize)) {
func.Invoke(Frame);
RaiseValueReadEvent(Frame.DataAddress, Frame.DataCount);
return true;
} else {
if (NextData != null) {
return NextData.ScannAll(func, Frame);
}
return false;
}
}
};
//  usage
gCoils.ScannAll(gCoils.ReadMultiple, Frame);

问题显然是对类的下一个实例的递归调用NextData.ScannAll(函数,帧(;因为类成员变量不再有效。

我在C#中了解到委托函数有些静态。解决方案可以是还传递类引用。但也许索博迪有更好的主意。

您可以创建另一个接受未绑定到指定目标的ModbusDataMBSFrame的委托,并将当前实例传递给它。

public delegate void ModDataFunc(MBSFrame Frame);
private delegate void StaticModDataFunc(ModbusData ths, MBSFrame Frame);
private bool ScannAll(StaticModDataFunc func, MBSFrame Frame)
{
if (Frame.MatchAddress(MyBaseAddr, MySize))
{
func(this, Frame);
RaiseValueReadEvent(Frame.DataAddress, Frame.DataCount);
return true;
}
else
{
if (NextData != null)
{
return NextData.ScannAll(func, Frame);
}
return false;
}
}
public bool ScannAll(ModDataFunc func, MBSFrame Frame)
{
return ScannAll(func.Method.CreateDelegate<StaticModDataFunc>(), Frame);
}

最新更新