2011-12-27 3 views
72

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

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

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

"Method name expected"

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

+5

Ответы на дублированный вопрос сосут хотя. Главный ответ здесь должен быть каноническим ответом. –

ответ

183

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

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

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

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

Спасибо, сработало! Мне пришлось изменить имена отправителя и e в первом наборе скобок, потому что они были такими же, как и в содержащем методе. Не могли бы вы объяснить мне, что это такое? то есть какая разница между отправителем, e в первой скобке и секундами? – Matt

+3

'(sender, e) => PlayMusicEvent (sender, e, musicNote)' является анонимным методом. Значения в первых скобках являются фактическими именами параметров, а значения во вторых скобках - это фактическое использование параметров. Подумайте об этом как о короткой форме для 'void NONAME (var sender, var e) {PlayMusicEvent (sender, e, musicNote); } 'где имена параметров выводятся из контекста, а' musicNote' берется из локальных переменных. Эта одна строка создает новый метод, который использует ваш метод и устанавливает его как обработчик события таймера. – MagnatLU

+11

И как удалить этот «eventHandler»? '- =' не работает. – Houssni

3

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

myTimer.Elapsed += PlayMusicEvent; 

где

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

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

Смежные вопросы