Передать параметр в EventHandler

У меня есть следующее EventHandler к которому я добавил параметр 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));

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

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

РЕДАКТИРОВАТЬ: В этом случае я просто передать е от метода, который содержит этот фрагмент кода, как бы я передать собственный таймер EventArgs?

2 ответа

Решение

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

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

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

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

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

myTimer.Elapsed += PlayMusicEvent;

где

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

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

Другие вопросы по тегам