在C++/CLI中使用EventHandler

man*_*hah 2 c# c++-cli

- 我试图在c ++/cli中使用事件处理程序来抛出事件然后在c#中订阅它

class Mclass
{
 event System::EventHandler ^ someEvent;
 void ShowMessage(System::String ^)
 {
  someEvent(this,message);
 }
}
Run Code Online (Sandbox Code Playgroud)

- 但它会引发错误

错误C2664:'managed :: Mclass :: someEvent :: raise':无法将参数2从'System :: String ^'转换为'System :: EventArgs ^'

如何纠正它

Han*_*ant 8

EventHandler委托类型需要EventArgs类型的对象作为第二个参数,而不是字符串.解决问题的一种快速方法是声明自己的委托类型:

public:
    delegate void SomeEventHandler(String^ message);
    event SomeEventHandler^ someEvent;
Run Code Online (Sandbox Code Playgroud)

但这不是.NET的方式. 开始通过派生从EventArgs的派生存储任何自定义事件参数自己的小助手类:

public ref class MyEventArgs : EventArgs {
    String^ message;
public:
    MyEventArgs(String^ arg) {
        message = arg;
    }
    property String^ Message {
        String^ get() { return message; }
    }
};
Run Code Online (Sandbox Code Playgroud)

你然后使用这样:

public ref class Class1
{
public:
    event EventHandler<MyEventArgs^>^ someEvent;

    void ShowMessage(System::String^ message) {
        someEvent(this, gcnew MyEventArgs(message));
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意使用通用的EventHandler <>类型而不是原始的非泛型类型.它比简单的方法更多的代码,但它在客户端代码程序员非常友好,他会立即知道如何使用您的事件,因为它遵循标准模式.