Параметр Pass для EventHandler

У меня есть следующий EventHandler, к которому я добавил параметр MusicNote music:

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));

но получите ошибку:

"Ожидаемое имя метода"

EDIT: В этом случае я просто передаю e из метода, который содержит этот фрагмент кода, как я могу передать таймер EventArgs?

Ответ 1

Timer.Elapsed ожидает метод конкретной сигнатуры (с аргументами object и EventArgs). Если вы хотите использовать ваш метод PlayMusicEvent с дополнительным аргументом, оцененным во время регистрации события, вы можете использовать лямбда-выражение в качестве адаптера:

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

Изменить: вы также можете использовать более короткую версию:

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

Ответ 2

Если я правильно понимаю вашу проблему, вы вызываете метод вместо передачи его в качестве параметра. Попробуйте следующее:

myTimer.Elapsed += PlayMusicEvent;

где

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

Но вам нужно подумать о том, где хранить заметку.