我正在将一个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#中了解到委托函数有些静态。解决方案可以是还传递类引用。但也许索博迪有更好的主意。
您可以创建另一个接受未绑定到指定目标的ModbusData
和MBSFrame
的委托,并将当前实例传递给它。
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);
}