Возможно ли "цепочка" 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 и выполнение обычной проверки всегда возможно, но в случае, когда есть много вложенных событий, он будет иметь множество шаблонов.
Ответы
Ответ 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);
}
}
Преимущество второй формы заключается в том, что источником события является промежуточный класс, а не мастер, что разумно, как то, на что подписали обработчики.