2011-12-27 90 views
72

我有以下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)); 

,但得到的錯誤:

"Method name expected"

編輯:在這種情況下,我只是通過電子郵件m包含這段代碼的方法,我將如何通過計時器自己的EventArgs

+5

重複問題的答案雖然吸引。這裏的最高迴應應該是規範的答案。 – 2015-10-15 19:11:48

回答

183

Timer.Elapsed需要特定簽名的方法(參數爲objectEventArgs)。如果你想與事件註冊期間評估額外的參數使用PlayMusicEvent方法,你可以使用lambda表達式作爲適配器:

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

編輯:你也可以使用更短的版本:

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

感謝它的工作!我必須更改第一組括號中的發件人和e的名稱,因爲它們與包含方法中的相同。你能向我解釋他們是什麼嗎?即發送者,第一個括號中的e和第二個中的那個之間有什麼區別? – Matt 2011-12-27 11:57:30

+3

'(sender,e)=> PlayMusicEvent(sender,e,musicNote)'是匿名方法。第一個括號中的值是實際參數名稱,第二個括號中的值是實際參數的用法。把它看作'void NONAME(var sender,var e){PlayMusicEvent(sender,e,musicNote); }'參數名是從上下文中推斷出來的,'musicNote'是從局部變量中獲取的。這一行創建使用您的方法的新方法,並將其設置爲定時器事件的處理程序。 – MagnatLU 2011-12-27 12:00:18

+11

以及如何刪除這個'eventHandler'? ' - ='不起作用。 – Houssni 2013-03-02 14:59:11

3

如果我正確理解你的問題,你正在調用一個方法,而不是將它作爲參數傳遞。請嘗試以下操作:

myTimer.Elapsed += PlayMusicEvent; 

其中

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

但是你需要考慮在哪裏存儲您的筆記。

相關問題