提问人:jokn 提问时间:1/13/2022 最后编辑:πάντα ῥεῖjokn 更新时间:1/13/2022 访问量:221
C# 类成员函数指针和 c++ this->*func
C# class member function pointer and c++ this->*func
问:
我正在将一个C++项目移植到 C#,并且对 this->function 指针有疑问。 在 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);
问题出在类的下一个 instace 的递归调用 NextData.ScannAll(函数,框架); 因为类成员变量不再有效。
我在 C# 中了解到委托函数在某种程度上是静态的。解决方案可能是同时传递类引用。 但也许 sombody 有更好的主意。
答:
1赞
Sohaib Jundi
1/13/2022
#1
您可以创建另一个接受且未绑定到指定目标的委托,并将当前实例传递给该委托。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);
}
评论
0赞
jokn
1/13/2022
事实上,这就是我之前提到的,使用成员函数传递 this 指针。但是此时我的成员函数是静态的,因为相关类在参数列表中。为了让我的问题更清楚,我将创建一个新问题。
0赞
Sohaib Jundi
1/13/2022
它不会变成静态的,第一个参数会变成 this 指针。
评论
ModbusData
ScannAll