c# - 使用扩展方法添加事件

标签 c# events extension-methods

我找到了几篇关于使用扩展方法引发事件的帖子,但是我的问题有点不同:

我有一个这样的界面:

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

使用这个接口(interface)我可以创建如下的扩展方法:

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

我真正想要的是需要触发一些事件,例如:statechange-event

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

最佳答案

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

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

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

您可以将扩展方法SubscribeUnsubscribe 添加到IStateMachine

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

关于c# - 使用扩展方法添加事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202666/

相关文章:

c# - 使用相同的名称/命名空间实例化不同的类

vb.net - 将事件添加到项目中的所有表单

javascript - addEventListener 在 CreateJS 中不起作用

c# - 使用相互约束的类型参数调用泛型扩展方法时不能省略扩展类型参数

c# - 包含在 C# 中比较字符串数组的方法

c# - 如何在没有ajax的情况下在Web表单中打开弹出窗口 modelpopupextender

c# - 从派生类在 C# 基类中设置大量属性的最佳实践

c# - 如何右对齐 WPF ListItem 的某些元素?

java - JButtons 没有正确显示 borderlayout,还有向按钮添加 actionListener 的问题

view - 如何在 MVC 6 中定义具有默认内容的部分?