Передать параметр в 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));

но получаю ошибку:

"имя метода положено"

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

2 81

2 ответа:

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

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

Edit: вы также можете использовать сокращенный вариант:

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

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