我一直在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 :(得分:2)
C#没有代码生成能力。您可以尝试使用帮助网站库(例如PostSharp)实现类似行为。并且我建议用于实现观察者 - 用户模式可用接口IObserver< T>和IObservable< T>蚂蚁看了Reactive Extensions library。
答案 1 :(得分:1)
您可以使用T4从列表中自动生成委托和接口,并在构建时以与C宏类似的方式自动生成委托和接口。