2010-02-24 15 views
20

İç nesne örneğinden gelen olayları, bu gibi bir sözdizimi ile nesne nesnesinin olay işleyicilerine devretmek mümkündür:C# olay işleyicileri "zincirleme" mümkün mü?

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

Yukarıdaki yapının motivasyonu, birçok sihirbaz benzeri UI akışına sahip olduğum ve Geri, İleri & Tasarımımda Açık Kapalı İlke ve Tek Sorumluluk İlkesine saygı duymak için tek bir sınıfa geçmeyi iptal edin.

OnFinish ve normal kontrole bir yöntem eklemek her zaman mümkündür, ancak iç içe geçmiş olayların bir sürü olması durumunda, bu lotların boilerplate kodu ile sona erecektir.

cevap

32

İki seçenek. Birincisi:

public event EventHandler Finish 
{ 
    add { wizard.Finish += value; } 
    remove { wizard.Finish -= value; } 
} 

İkinci olarak, belirtildiği gibi:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

private void WizardFinished(object sender, EventArgs e) 
{ 
    EventHandler handler = Finish; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

ikinci formun faydası olayın kaynağı daha sonra orta sınıf değil, sihirbaz gibi görünüyor olmasıdır - makul İşleyicilerin abone olduğu gibi.

+0

Teşekkürler, ikinci seçeneğin arkasındaki mantık sistemi bu şekilde uygulamak için yeterince iyi. Ve ilk seçenek için de eklediğim gibi ekstra yükleme ekleme için bir sözdizimi olduğunu fark etmedim. – plouh

+0

Merak ediyorum, niçin test etmeden önce Finish'e Finish'i atarsınız ve Finish'i çağırırsınız? – dckrooney

+0

@dcrooney: Bunun yerine işleyici çalıştırmış olmalı. Düzenleyecek –