2011-12-27 11 views
72

Mam następujący EventHandler do którego dodałem parametr MusicNote muzyka:Przełęcz parametrem EventHandler

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

muszę dodać obsługi do Timer tak:

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

ale dostać błąd:

"Method name expected"

EDYCJA: W tym przypadku po prostu przekazuję e. metodzie, która zawiera ten fragment kodu, w jaki sposób mogę przekazać zegar EventArgs timera?

+5

Odpowiedzi na zduplikowane pytanie są do przyjęcia. Najlepszą reakcją powinna tu być odpowiedź kanoniczna. –

Odpowiedz

183

Timer.Elapsed oczekuje metody określonego podpisu (z argumentami object i EventArgs). Jeśli chcesz użyć metody PlayMusicEvent z dodatkowym argumentem ocenianego podczas rejestracji zdarzeń, można użyć wyrażenia lambda jako adapter:

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

EDIT: można również użyć krótszą wersję:

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

Dzięki temu zadziałało! Musiałem zmienić nazwy nadawcy i e w pierwszym zestawie nawiasów, ponieważ były one takie same jak w metodzie zawierającej. Czy możesz mi wyjaśnić, czym one są? tj. jaka jest różnica między nadawcą, e w pierwszym nawiasie a tymi w drugim? – Matt

+3

'(sender, e) => PlayMusicEvent (sender, e, musicNote)' jest metodą anonimową. Wartości w pierwszych nawiasach są rzeczywistymi nazwami parametrów, a wartości w nawiasach są rzeczywistymi parametrami. Pomyśl o tym jako o skróconej formie dla 'void NONAME (var sender, var e) {PlayMusicEvent (sender, e, musicNote); } 'gdzie nazwy parametrów są wywnioskowane z kontekstu, a' musicNote' pochodzi ze zmiennych lokalnych. Ta jedna linia tworzy nową metodę, która wykorzystuje twoją metodę i ustawia ją jako program obsługi zdarzenia zegara. – MagnatLU

+11

A jak usunąć ten "eventHandler"? '- =' nie działa. – Houssni

3

Jeśli dobrze rozumiem Twój problem, to zamiast wywoływania go jako parametru wywołuje się metodę. Spróbuj wykonać następujące czynności:

myTimer.Elapsed += PlayMusicEvent; 

gdzie

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

Ale trzeba myśleć o tym, gdzie zapisać notatkę.