plo*_*ouh 22 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;
}
}
Run Code Online (Sandbox Code Playgroud)
上述结构的动机是我有许多类似向导的UI流程,并希望将Back,Forward和Cancel处理分离到单个类,以在我的设计中尊重Open Closed Principle和Single Responsibility Principle.
添加方法OnFinish并进行正常检查总是有可能的,但是如果有很多嵌套事件,那么最终将会有大量的样板代码.
Jon*_*eet 35
两种选择.第一:
public event EventHandler Finish
{
add { wizard.Finish += value; }
remove { wizard.Finish -= value; }
}
Run Code Online (Sandbox Code Playgroud)
其次,如你所说:
public event EventHandler Finish;
wizard.Finish += WizardFinished;
private void WizardFinished(object sender, EventArgs e)
{
EventHandler handler = Finish;
if (handler != null)
{
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
第二种形式的好处是,事件的来源似乎是中间类,而不是向导 - 这是合理的,因为这是处理程序订阅的.