是否可以在c#中"链接"EventHandlers?

plo*_*ouh 22 c# event-handling

是否可以使用如下语法将事件从内部对象实例委托给corrent对象的事件处理程序:

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;
   } 
}
Run Code Online (Sandbox Code Playgroud)

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

添加方法OnFinish并进行正常检查总是有可能的,但是如果有很多嵌套事件,那么最终将会有大量的样板代码.

Jon*_*eet 35

两种选择.第一:

 public event EventHandler Finish
 {
     add { wizard.Finish += value; }
     remove { wizard.Finish -= value; }
 }
Run Code Online (Sandbox Code Playgroud)

其次,如你所说:

 public event EventHandler Finish;

 wizard.Finish += WizardFinished;

 private void WizardFinished(object sender, EventArgs e)
 {
     EventHandler handler = Finish;
     if (handler != null)
     {
         handler(this, e);
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

  • @dcrooney:是的:如果我们直接调用Finish,它可能会因NullReferenceException而失败.如果我们只测试Finish而*然后*调用它,则值可能会在测试和调用之间发生变化. (7认同)