web-dev-qa-db-ja.com

EventHandlerにパラメーターを渡す

パラメータEventHandler musicを追加した次のMusicNoteがあります。

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

次のようにハンドラーをTimerに追加する必要があります。

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

しかし、エラーが発生します:

「メソッド名が必要です」

編集:この場合、このコードスニペットを含むメソッドからeを渡すだけですが、タイマー自身のEventArgsを渡すにはどうすればよいですか?

91
Matt

Timer.Elapsedは、特定の署名のメソッドを必要とします(引数objectおよびEventArgsを使用)。追加の引数を評価してPlayMusicEventメソッドを使用したい場合イベント登録中、ラムダ式をアダプターとして使用できます。

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

編集:より短いバージョンを使用することもできます:

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

問題を正しく理解していれば、パラメーターとして渡すのではなくメソッドを呼び出しています。以下を試してください:

myTimer.Elapsed += PlayMusicEvent;

どこ

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

ただし、メモを保存する場所について考える必要があります。

5