2016-03-27 196 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宏产生它的构建。

相关问题