2010-02-24 9 views
20

Is è possibile delegare gli eventi da un'istanza di oggetto interno ai gestori di eventi dell'oggetto corrent con una sintassi simile a questo:È possibile "concatenare" EventHandlers in C#?

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

La motivazione per la struttura di cui sopra è che ho molti flussi di interfaccia utente wizard-like e voluto separare the Back, Forward & Annulla la gestione di una singola classe per rispettare il principio Open Closed e il principio di singola responsabilità nella mia progettazione.

Aggiungendo un metodo OnFinish e facendo il normale controllo è sempre possibile, ma nel caso in cui ci siano molti eventi annidati, finirà con il codice di lotto di codice.

risposta

32

Due opzioni. Primo:

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

In secondo luogo, come lei ha detto:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

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

Il vantaggio della seconda forma è che l'origine dell'evento poi sembra essere la classe intermedia, non il mago - che è ragionevole in quanto è ciò a cui si sono abbonati gli handler.

+0

Grazie, il ragionamento alla base della seconda opzione è sufficiente per implementare il sistema in questo modo. E grazie per la prima opzione anche perché non avevo capito che c'era una sintassi per l'overloading add. – plouh

+0

Per curiosità, perché assegni Finish al gestore prima di eseguire il test di null e di invocare Finish? – dckrooney

+0

@dcrooney: dovrebbe invece essere invocato il gestore. Modificherà. –

Problemi correlati