我发现了一些关于使用扩展方法提升事件的帖子,但我的问题有点不同:
我有这样的界面:
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
的类,因此我每次都必须重做相同的代码。
答案 0 :(得分:4)
在C#中,只有扩展方法。没有扩展属性或事件。
您必须在界面上声明该事件 为了避免一遍又一遍地编写相同的事件代码,您可以创建一个基类。
另一种可能性是“手动”实现Publish-Subscribe模式。这就是C#中的事件。
您可以将扩展程序Subscribe
和Unsubscribe
添加到IStateMachine
。
他们会使用可能是静态的类StateMachineSubscribers
,它也会公开Subscribe
和Unsubscribe
方法。此外,它还公开了Raise
扩展方法使用的ChangeState
方法。
答案 1 :(得分:0)
具有相应委托的事件可以是具体类的一部分,实现 IStateMachine
接口。因此,如果您在界面上调用SetState
,则会调用其具体类的具体实现,其内部会引发您想要的事件。