2016-03-27 102 views
0

我一直在執行一種在C#觀察者模式的,即是這樣的:有沒有辦法在C#中使用泛型創建聲明?

public delegate void MyEventOccurred(MyEventArg arg); 
public interface IMyEventOccurred 
{ 
    void OnMyEventOccurred(MyEventArg arg); 
} 

class MyProviderClass 
{ 
    protected MyEventOccurred OnMyEventOccurredHandler; 
    public void AddMyEventOccurredHandler(MyEventOccurred handler) 
    { 
     OnMyEventOccurredHandler -= handler; 
     OnMyEventOccurredHandler += handler; 
    } 

    public void RemoveMyEventOccurredHandler(MyEventOccurred handler) 
    { 
     OnMyEventOcurredHandler -= handler; 
    } 
} 

要使用這個類,我們有以下幾點:

class MyObserverClass : IMyEventOccurred 
{ 
    void OnMyEventOccurred(MyEventArg arg) 
    { 
     // Handle my event 
    } 

    void StartObserving(MyProviderClass provider) 
    { 
     provider.AddMyEventOccurredHandler(OnMyEventOccurred); 
    } 

    void StopObserving(MyProviderClass provider) 
    { 
     provider.RemoveMyEventOccurredHandler(OnMyEventOccurred); 
    } 
} 

我很想在人們評論關於是否有改進/更好的方法來實現/展示這個模式,但是我的主要問題是關於是否有一種方法以通用的方式完成所有這些聲明,相當於我可能用C++創建的宏。

有很多代碼在聲明這是完全通用的,尤其是命名。

在C++中我可以使用宏來申報委託和接口,是這樣的:

#define DECLARE_EVENT(eventName, eventArg) \ 
    public delegate void eventName(eventArg arg); \ 
    public interface I ## eventName \ 
    { \ 
     void On ## eventName(eventArg arg); \ 
    } 

很顯然,這隱藏了許多這是怎麼回事的,但它允許更快的實施,減少了錯誤並強化一致性。

是否存在一些簡化C#中實現的等效方法?

感謝

+0

是的,可觀察模式是建立在C#和暴露的思想事件。 https://msdn.microsoft.com/en-us/library/awbftdfh.aspx您並不需要從零開始實施該事件,只需使用語言提供的那個 –

回答

2

C#沒有代碼生成能力。您可以嘗試通過幫助網站庫實現類似的行爲,如PostSharp。我建議使用實現觀察員用戶模式可用接口IObserver <T>和IObservable <T>螞蟻看看Reactive Extensions library

1

您可以使用T4從列表中自動生成委託和接口,並自動以類似的方式,以C宏產生它的構建。

相關問題