可以使用以下语法将事件从内部对象实例委派到相应对象的事件处理程序:
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和Cancel处理分离到一个类中,以在设计中遵守开放式封闭原则和单一责任原则。
添加方法OnFinish并进行常规检查总是可能的,但是如果有很多嵌套事件,那么最终将得到很多样板代码。
最佳答案
两种选择。第一的:
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);
}
}
第二种形式的好处是,事件的来源似乎是中间类,而不是向导-这是合理的,因为这是处理程序已订阅的内容。