2013-04-03 115 views
0

我有一個包含C#UI,C++/CLI混合模式interop包裝和一些本地C++項目的系統。C++/cli中的觀察者模式混合託管/非託管

我需要做的是建立一個系統,以便原生C++代碼可以發送日誌消息,並且UI可以報告它。

我使用this作爲模板設置了本機IObservable,但是C#代碼不能成爲觀察者。我的想法是在C++/CLI中設置另一個觀察者模式,它觀察本地觀察者,並讓C#實現它。我用this作爲模板,但我努力將其轉換爲有效的C++/CLI。

ref class Observable 
{ 
public: 
Observable(void); 
virtual ~Observable(void); 

event System::EventHandler^ SomethingHappened; 

void DoSomething() { 
    System::EventHandler^ handler = SomethingHappened; 
    //if (handler != nullptr) 
    //{ 
     handler(this, System::EventArgs::Empty); 
    //}//null check not permitted in C++/CLI 
}; 

給出錯誤:C3918:require SomethingHappened to be a data member。 This is the MSDN page - 但我無法確定我做錯了什麼。

有什麼建議嗎?

感謝, 梅拉妮

回答

0

您正在嘗試使用C#語法。在C++/CLI中事件的工作方式有點不同,除了添加和刪除訪問器之外,它們還有一個raise accessor。換句話說,這是一種引發事件的方法。編譯器自動生成一個,如果你沒有提供你的顯式版本。這使得引發事件很簡單:

void DoSomething() { 
    SomethingHappened(this, System::EventArgs::Empty); 
} 
+0

我發現的作品的解釋:-)我明白這一點。 – Melanie

0

使用this,做正確的事是直接觸發事件。像這樣:

void DoSomething() {  
    SomethingHappened(this, System::EventArgs::Empty); 
}