使用扩展方法添加事件

时间:2013-03-04 13:27:59

标签: c# events extension-methods

我发现了一些关于使用扩展方法提升事件的帖子,但我的问题有点不同:

我有这样的界面:

public interface IStateMachine 
{
    void SetState(IState NewState);
    IState GetState();
}

使用此界面,我可以创建如下的扩展方法:

public static void ChangeState(this IStateMachine StateMachine, IState NewState) 
{
    StateMachine.GetState().Exit();
    StateMachine.SetState(NewState);
    StateMachine.GetState().Enter();
}

我真正想要的是会有需要解雇的事件,例如:statechange-event

但是我不希望StatechangeEvent成为IStateMachine接口的一部分,但似乎这是唯一的方法。我有几个实现IStateMachine的类,因此我每次都必须重做相同的代码。

2 个答案:

答案 0 :(得分:4)

在C#中,只有扩展方法。没有扩展属性或事件。

您必须在界面上声明该事件 为了避免一遍又一遍地编写相同的事件代码,您可以创建一个基类。

另一种可能性是“手动”实现Publish-Subscribe模式。这就是C#中的事件。

您可以将扩展程序SubscribeUnsubscribe添加到IStateMachine

他们会使用可能是静态的类StateMachineSubscribers,它也会公开SubscribeUnsubscribe方法。此外,它还公开了Raise扩展方法使用的ChangeState方法。

答案 1 :(得分:0)

具有相应委托的事件可以是具体类的一部分,实现 IStateMachine接口。因此,如果您在界面上调用SetState,则会调用其具体类的具体实现,其内部会引发您想要的事件。