wake-up-neo.net

Parameter an EventHandler übergeben

Ich habe den folgenden EventHandler, zu dem ich einen Parameter MusicNote music hinzugefügt habe:

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

Ich muss den Handler wie folgt zu einem Timer hinzufügen:

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

aber erhalte den Fehler:

"Methodenname erwartet"

BEARBEITEN: In diesem Fall übergebe ich einfach e von der Methode, die dieses Code-Snippet enthält. Wie würde ich das eigene EventArgs des Timers übergeben?

91
Matt

Timer.Elapsed erwartet die Methode der spezifischen Signatur (mit den Argumenten object und EventArgs). Wenn Sie Ihre PlayMusicEvent -Methode mit zusätzlichem ausgewertetem Argument während der Ereignisregistrierung verwenden möchten, können Sie den Lambda-Ausdruck als Adapter verwenden:

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

Edit: Sie können auch eine kürzere Version verwenden:

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

Wenn ich Ihr Problem richtig verstehe, rufen Sie eine Methode auf, anstatt sie als Parameter zu übergeben. Versuche Folgendes:

myTimer.Elapsed += PlayMusicEvent;

woher

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

Sie müssen sich jedoch überlegen, wo Ihre Notiz gespeichert werden soll.

5