- 我正在尝试在c ++ / cli中使用事件处理程序来抛出事件然后在c#中订阅它
class Mclass
{
event System::EventHandler ^ someEvent;
void ShowMessage(System::String ^)
{
someEvent(this,message);
}
}
- 但它会抛出错误
错误C2664:'managed :: Mclass :: someEvent :: raise':无法将参数2从'System :: String ^'转换为'System :: EventArgs ^'
如何纠正
答案 0 :(得分:8)
EventHandler委托类型需要EventArgs类型的对象作为第二个参数,而不是字符串。解决问题的一种快速方法是声明自己的委托类型:
public:
delegate void SomeEventHandler(String^ message);
event SomeEventHandler^ someEvent;
但那不是.NET方式。 那从派生自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&lt;&gt;键入而不是原始的非泛型。它比简单的方法更多的代码,但它在客户端代码程序员非常友好,他会立即知道如何使用您的事件,因为它遵循标准模式。
答案 1 :(得分:3)
正如winSharp93指出的那样,System::EventHandler
的签名需要System::EventArgs
。你可以:
创建您自己的EventArgs
派生类,其中包含您想要的字符串消息,
使用您自己的委托代替`System :: EventHandler':
delegate void MyDelegate(string^);
event MyDelegate^ someEvent;
答案 2 :(得分:2)
您不能将字符串作为第二个参数传递给EventHandler
。
相反,请尝试:
someEvent(this,System :: EventArgs :: Empty)
如果您需要传递自定义数据,可以创建EventArgs
的子类并使用System::EventHandler<TEventArgs>
。