【问题标题】:Is it possible to "chain" EventHandlers in c#?是否可以在 c# 中“链接”事件处理程序?
【发布时间】:2010-02-24 07:16:19
【问题描述】:

可以使用如下语法将来自内部对象实例的事件委托给正确对象的事件处理程序:

public class MyControl {
   public event EventHandler Finish;

   private Wizard wizard;
   public MyControl( Wizard wizard ) {
      this.wizard = wizard;

      // some other initialization going on here...

      // THIS is what I want to do to chain events
      this.wizard.Finish += Finish;
   } 
}

上述结构的动机是我有许多类似向导的 UI 流程,并希望将 Back、Forward 和 Cancel 处理分离到一个类中,以在我的设计中尊重 Open Closed 原则和 Single Responsibility 原则。

添加一个方法 OnFinish 并进行常规检查总是有可能的,但如果有很多嵌套事件,最终会得到很多样板代码。

【问题讨论】:

    标签: c# event-handling


    【解决方案1】:

    两个选项。第一:

     public event EventHandler Finish
     {
         add { wizard.Finish += value; }
         remove { wizard.Finish -= value; }
     }
    

    第二,正如你所说:

     public event EventHandler Finish;
    
     wizard.Finish += WizardFinished;
    
     private void WizardFinished(object sender, EventArgs e)
     {
         EventHandler handler = Finish;
         if (handler != null)
         {
             handler(this, e);
         }
     }
    

    第二种形式的好处是事件的来源似乎是中间类,而不是向导 - 这是合理的,因为这是处理程序订阅的。

    【讨论】:

    • 谢谢,第二个选项背后的推理足以以这种方式实现系统。也感谢第一个选项,因为我没有意识到重载 add 的语法。
    • 出于好奇,为什么在测试 null 并调用 Finish 之前将 Finish 分配给处理程序?
    • @dcrooney:那应该调用处理程序。将编辑。
    • @Jon:感谢您的澄清!但是,我仍然缺少将 Finish 分配给处理程序所获得的东西;这比直接调用 Finish 有优势吗?
    • @dcrooney:是的:如果我们直接调用 Finish,它可能会因 NullReferenceException 而失败。如果我们只是测试 Finish 并 然后 调用它,那么值可能会在测试和调用之间发生变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多