Можно ли "связать" EventHandlers в c #? - PullRequest
22 голосов
/ 24 февраля 2010

Есть возможность делегировать события из экземпляра внутреннего объекта обработчикам событий другого объекта с помощью следующего синтаксиса:

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

Мотивация для приведенной выше структуры заключается в том, что у меня есть много потоков, подобных мастерам, и я хотел разделить обработку Back, Forward & Cancel для одного класса, чтобы соблюдать принцип Open Closed принцип и принцип единой ответственности в моем проекте.

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

1 Ответ

35 голосов
/ 24 февраля 2010

Два варианта. Во-первых:

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

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

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