C# 将参数传递给EventHandler

C# 将参数传递给EventHandler,c#,event-handling,parameter-passing,C#,Event Handling,Parameter Passing,我有以下EventHandler,其中添加了一个参数MusicNotemusic: public void PlayMusicEvent(object sender, EventArgs e,MusicNote music) { music.player.Stop(); System.Timers.Timer myTimer = (System.Timers.Timer)sender; myTimer.Stop(); } 我需要将处理程序添加到计时器中,如下所示: my

我有以下
EventHandler
,其中添加了一个参数
MusicNote
music:

public void PlayMusicEvent(object sender, EventArgs e,MusicNote music)
{
    music.player.Stop();
    System.Timers.Timer myTimer = (System.Timers.Timer)sender;
    myTimer.Stop();
}
我需要将处理程序添加到
计时器中,如下所示:

myTimer.Elapsed += new ElapsedEventHandler(PlayMusicEvent(this, e, musicNote));
但是得到错误:

“应为方法名称”


编辑:在本例中,我只是从包含此代码段的方法中传递e,如何传递计时器自己的
EventArgs

timer。经过的
需要特定签名的方法(带有参数
object
EventArgs
)。如果要在事件注册过程中使用
PlayMusicEvent
方法并计算附加参数,可以将lambda表达式用作适配器:

myTimer.Elapsed += new ElapsedEventHandler((sender, e) => PlayMusicEvent(sender, e, musicNote));
编辑:您也可以使用较短的版本:

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

如果我正确理解了您的问题,那么您正在调用一个方法,而不是将其作为参数传递。请尝试以下操作:

myTimer.Elapsed += PlayMusicEvent;
在哪里


但是你需要考虑把你的便条放在哪里。

谢谢,它起作用了!我必须更改第一组括号中的sender和e的名称,因为它们与containing方法中的名称相同。你能给我解释一下它们是什么吗?i、 e.第一个括号中的发送者e和第二个括号中的发送者e有什么区别?
(发送者e)=>PlayMusicEvent(发送者e,musicNote)
是匿名方法。第一个括号中的值是实际参数名称,第二个括号中的值是实际参数的用法。可以把它看作是
void NONAME(var sender,var e){PlayMusicEvent(sender,e,musicNote)}
的缩写,其中参数名是从上下文推断的,而
musicNote
是从局部变量获取的。这一行创建了使用您的方法的新方法,并将其设置为计时器事件的处理程序。如何删除此
eventHandler
<代码>-=
不起作用。@EruRōraito在这种情况下,无法从匿名方法取消订阅(如Yassine Houssni所述)。要取消订阅,您需要将事件处理程序对象(ElapsedEventHandler)存储在某个位置,然后从该实例中取消订阅。这里最重要的回答应该是标准答案。
public void PlayMusicEvent(object sender, ElapsedEventArgs e)
{
    music.player.Stop();
    System.Timers.Timer myTimer = (System.Timers.Timer)sender;
    myTimer.Stop();
}