web-dev-qa-db-fra.com

Passer le paramètre à EventHandler

J'ai le suivant EventHandler auquel j'ai ajouté un paramètre MusicNote music:

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

J'ai besoin d'ajouter le gestionnaire à un Timer comme ceci:

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

mais obtenez l'erreur:

"Nom de la méthode attendu"

EDIT: Dans ce cas, je passe simplement de la méthode qui contient cet extrait de code, comment pourrais-je transmettre le propre EventArgs de la minuterie?

91
Matt

Timer.Elapsed attend une méthode de signature spécifique (avec les arguments object et EventArgs). Si vous souhaitez utiliser votre méthode PlayMusicEvent avec un argument supplémentaire évalué lors de l'enregistrement de l'événement, vous pouvez utiliser l'expression lambda comme adaptateur:

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

Edit: vous pouvez aussi utiliser une version plus courte:

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

Si je comprends bien votre problème, vous appelez une méthode au lieu de la transmettre en tant que paramètre. Essayez ce qui suit:

myTimer.Elapsed += PlayMusicEvent;

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

Mais vous devez penser à l'endroit où stocker votre note.

5
Dmitry Polyanitsa