2012-03-14 19 views
0

-I想使用事件處理程序在C++/CLI拋出事件,然後在C#在C使用事件處理++/CLI

class Mclass 
{ 
event System::EventHandler^someEvent; 
void ShowMessage(System::String ^) 
{ 
    someEvent(this,message); 
} 
} 

訂閱它 - 但它會引發錯誤

錯誤C2664:'管理:: Mclass :: someEvent ::加薪:系統:字符串^」無法從轉換參數2‘’到‘系統:EventArgs的^’

如何糾正它

回答

2

正如winSharp93指出的那樣,System::EventHandler的簽名需要System::EventArgs。您可以:

  1. 創建包含您想要的字符串消息自己EventArgs派生類,

  2. 使用自己的委託,而不是`系統::事件處理程序「:

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

+0

這裏在第二種情況下,我們必須明確定義add remove和raise方法嗎? – 2012-03-14 10:19:38

+0

@ManuDilipShah,不。他們的工作只是喜歡任何其他事件。 – 2012-03-14 10:20:13

+0

感謝您的幫助 – 2012-03-14 10:25:39

1

你不能傳遞字符串到EventHandler作爲第二個參數。

相反,嘗試:

someEvent(這一點,系統:: EventArgs的::空)

如果您需要通過自定義數據,您可以創建EventArgs一個子類,並使用System::EventHandler<TEventArgs>

6

EventHandler委託類型需要一個EventAr類型的對象gs作爲第二個參數,而不是一個字符串。解決您的問題的快速方法是聲明您自己的代理類型:

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)); 
    } 
}; 

注意使用通用的事件處理程序<的>類型,而不是原始的非泛型的。它比簡單的方法更多的代碼,但它對客戶端代碼編程人員非常友好,他會立即知道如何使用您的事件,因爲它遵循標準模式。