Подтвердить что ты не робот

Возможно ли "цепочка" EventHandlers в С#?

Можно ли делегировать события из экземпляра внутреннего объекта обработчикам событий объекта 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;
   } 
}

Мотивация для вышеуказанной структуры состоит в том, что у меня есть много волшебных потоков пользовательского интерфейса, и я хотел бы отделить обработку "Назад", "Вперед" и "Отмена" к одному классу в соответствии с принципом открытого закрытого принципа и принципа единой ответственности в моем дизайне.

Добавление метода OnFinish и выполнение обычной проверки всегда возможно, но в случае, когда есть много вложенных событий, он будет иметь множество шаблонов.

4b9b3361

Ответ 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);
     }
 }

Преимущество второй формы заключается в том, что источником события является промежуточный класс, а не мастер, что разумно, как то, на что подписали обработчики.