在C ++ / CLI中使用EventHandler

时间:2012-03-14 10:04:48

标签: c# c++-cli

- 我正在尝试在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 ^'

如何纠正

3 个答案:

答案 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。你可以:

  1. 创建您自己的EventArgs派生类,其中包含您想要的字符串消息,

  2. 使用您自己的委托代替`System :: EventHandler':

    delegate void MyDelegate(string^); event MyDelegate^ someEvent;

答案 2 :(得分:2)

您不能将字符串作为第二个参数传递给EventHandler

相反,请尝试:

  

someEvent(this,System :: EventArgs :: Empty)

如果您需要传递自定义数据,可以创建EventArgs的子类并使用System::EventHandler<TEventArgs>