- 我试图在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 ^'
如何纠正它
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 <>类型而不是原始的非泛型类型.它比简单的方法更多的代码,但它在客户端代码程序员非常友好,他会立即知道如何使用您的事件,因为它遵循标准模式.
| 归档时间: |
|
| 查看次数: |
6457 次 |
| 最近记录: |