有没有办法在C#中使用泛型创建声明?

时间:2016-03-27 08:37:25

标签: c# generics macros

我一直在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#中实现的等效方法?

由于

2 个答案:

答案 0 :(得分:2)

C#没有代码生成能力。您可以尝试使用帮助网站库(例如PostSharp)实现类似行为。并且我建议用于实现观察者 - 用户模式可用接口IObserver< T>和IObservable< T>蚂蚁看了Reactive Extensions library

答案 1 :(得分:1)

您可以使用T4从列表中自动生成委托和接口,并在构建时以与C宏类似的方式自动生成委托和接口。