是否可以在c#中“链接”事件处理程序?

时间:2010-02-24 07:16:19

标签: 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;
   } 
}

上述结构的动机是我有许多类似向导的UI流程,并希望将Back,Forward&在我的设计中取消对单个类的处理以尊重开放封闭原则和单一责任原则。

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

1 个答案:

答案 0 :(得分:35)

两个选项。第一:

 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);
     }
 }

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