2011-12-27 110 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(); 
} 

但是你需要考虑在哪里存储您的笔记。

相关问题