-我正在尝试使用 c++/cli 中的事件处理程序来引发事件,然后在 c# 中订阅它
class Mclass
{
event System::EventHandler ^ someEvent;
void ShowMessage(System::String ^)
{
someEvent(this,message);
}
}
- 但它会抛出错误
错误 C2664: 'management::Mclass::someEvent::raise' : 无法将参数 2 从 'System::String ^' 转换为 'System::EventArgs ^'
如何纠正
EventHandler 委托类型需要 EventArgs 类型的对象作为第二个参数,而不是字符串。解决问题的一个快速方法是声明您自己的委托类型:
public:
delegate void SomeEventHandler(String^ message);
event SomeEventHandler^ someEvent;
但这不是 .NET 的方式。That首先派生您自己的从 EventArgs 派生的小帮助器类来存储任何自定义事件参数:
public ref class MyEventArgs : EventArgs {
String^ message;
public:
MyEventArgs(String^ arg) {
message = arg;
}
property String^ Message {
String^ get() { return message; }
}
};
然后你可以这样使用:
public ref class Class1
{
public:
event EventHandler<MyEventArgs^>^ someEvent;
void ShowMessage(System::String^ message) {
someEvent(this, gcnew MyEventArgs(message));
}
};
请注意使用泛型 EventHandler 类型而不是原始的非泛型类型。它比简单方法需要更多代码,但它对客户端代码程序员非常友好,他会立即知道如何使用您的事件,因为它遵循标准模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)