将参数传递给EventHandler

时间:2011-12-27 11:43:40

标签: c# event-handling parameter-passing

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

但得到错误:

  

“预期的方法名称”

编辑:在这种情况下,我只是从包含此代码段的方法中传递e,我将如何传递计时器自己的EventArgs

2 个答案:

答案 0 :(得分:223)

Timer.Elapsed需要特定签名方法(带参数objectEventArgs)。如果要在事件注册期间使用PlayMusicEvent方法和评估,则可以使用lambda表达式作为适配器:

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

修改:您还可以使用更短的版本:

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

答案 1 :(得分:5)

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

myTimer.Elapsed += PlayMusicEvent;

,其中

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

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