2011-12-27 21 views
72

ho il seguente EventHandler a cui ho aggiunto un parametro MusicNote musica:parametro Pass EventHandler

public void PlayMusicEvent(object sender, EventArgs e,MusicNote music) 
{ 
    music.player.Stop(); 
    System.Timers.Timer myTimer = (System.Timers.Timer)sender; 
    myTimer.Stop(); 
} 

ho bisogno di aggiungere il gestore ad un Timer in questo modo:

myTimer.Elapsed += new ElapsedEventHandler(PlayMusicEvent(this, e, musicNote)); 

ma ottenere il errore:

"Method name expected"

MODIFICA: In questo caso, passo e fro m il metodo che contiene questo snippet di codice, come potrei passare lo stesso EventArgs del timer?

+5

Le risposte alla domanda duplicata fanno schifo. La risposta principale qui dovrebbe essere la risposta canonica. –

risposta

183

Timer.Elapsed prevede metodo di firma specifica (con argomenti object e EventArgs). Se si desidera utilizzare il metodo di PlayMusicEvent con ulteriore argomento valutata durante la registrazione dell'evento, è possibile utilizzare un'espressione lambda come un adattatore:

myTimer.Elapsed += new ElapsedEventHandler((sender, e) => PlayMusicEvent(sender, e, musicNote)); 

Edit: è anche possibile utilizzare la versione più corta:

myTimer.Elapsed += (sender, e) => PlayMusicEvent(sender, e, musicNote); 
+1

Grazie ha funzionato! Ho dovuto cambiare i nomi di mittente ed e nel primo set di parentesi perché erano gli stessi del metodo di contenimento. Potresti spiegarmi per favore cosa sono? cioè qual è la differenza tra mittente, e nella prima parentesi e quelli nella seconda? – Matt

+3

'(sender, e) => PlayMusicEvent (sender, e, musicNote)' è un metodo anonimo. I valori nelle prime parentesi sono i nomi dei parametri effettivi ei valori nelle parentesi quadre sono l'utilizzo dei parametri effettivi. Consideralo come una forma abbreviata per 'void NONAME (var sender, var e) {PlayMusicEvent (mittente, e, musicNote); } 'dove i nomi dei parametri sono dedotti dal contesto e' musicNote' è preso da variabili locali. Questa riga crea un nuovo metodo che usa il tuo metodo e lo imposta come gestore per l'evento del timer. – MagnatLU

+11

E come rimuovere questo 'eventHandler'? '- =' non funziona. – Houssni

3

Se ho capito bene il tuo problema, stai chiamando un metodo invece di passarlo come parametro. Provare quanto segue:

myTimer.Elapsed += PlayMusicEvent; 

dove

public void PlayMusicEvent(object sender, ElapsedEventArgs e) 
{ 
    music.player.Stop(); 
    System.Timers.Timer myTimer = (System.Timers.Timer)sender; 
    myTimer.Stop(); 
} 

Ma è necessario pensare a dove memorizzare la nota.