2011-12-27 9 views
72

Tengo el siguiente EventHandler a la que añade un parámetro MusicNote música:parámetro Pass a manejador de sucesos

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

necesito para agregar el controlador a un Timer así:

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

pero conseguir el error:

"Method name expected"

EDITAR: En este caso acabo de pasar e En el método que contiene este fragmento de código, ¿cómo pasaría el propio EventArgs del temporizador?

+5

Las respuestas sobre la pregunta duplicada apestan. La mejor respuesta aquí debería ser la respuesta canónica. –

Respuesta

183

Timer.Elapsed espera el método de firma específica (con argumentos object y EventArgs). Si desea utilizar el método de PlayMusicEvent con argumento adicional evaluado durante el registro de eventos, puede utilizar la expresión lambda como un adaptador:

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

Editar: también se puede utilizar la versión más corta:

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

¡Gracias funcionó! Tuve que cambiar los nombres de remitente ye en el primer conjunto de corchetes porque eran los mismos que en el método contenedor. ¿Podrías por favor explicarme qué son? es decir, ¿cuál es la diferencia entre emisor, e en el primer corchete y los del segundo? – Matt

+3

'(remitente, e) => PlayMusicEvent (sender, e, musicNote)' es un método anónimo. Los valores en los primeros corchetes son nombres de parámetros reales y los valores en los segundos corchetes son el uso real de los parámetros. Piénselo como una forma abreviada para 'void NONAME (var sender, var e) {PlayMusicEvent (sender, e, musicNote); } 'donde los nombres de los parámetros se deducen del contexto y' musicNote' se toma de las variables locales. Esta línea crea un nuevo método que usa su método y lo configura como controlador para el evento del temporizador. – MagnatLU

+11

Y cómo eliminar este 'eventHandler'? '- =' no funciona. – Houssni

3

Si entiendo su problema correctamente, está llamando a un método en lugar de pasarlo como parámetro. Pruebe lo siguiente:

myTimer.Elapsed += PlayMusicEvent; 

donde

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

Pero hay que pensar en dónde almacenar su nota.

Cuestiones relacionadas