将参数传递给 EventHandler [重复]

Posted

技术标签:

【中文标题】将参数传递给 EventHandler [重复]【英文标题】:Pass parameter to EventHandler [duplicate] 【发布时间】:2012-01-28 11:28:18 【问题描述】:

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

但得到错误:

“需要方法名”

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

【问题讨论】:

虽然重复问题的答案很糟糕。此处的首要响应应该是规范答案。 【参考方案1】:

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

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

编辑:您也可以使用较短的版本:

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

【讨论】:

谢谢它的工作!我不得不更改第一组括号中的 sender 和 e 的名称,因为它们与包含方法中的相同。你能向我解释一下它们是什么吗?即第一个括号中的发件人,e和第二个括号中的发件人有什么区别? (sender, e) => PlayMusicEvent(sender, e, musicNote) 是匿名方法。第一个括号中的值是实际参数名称,第二个括号中的值是实际参数的用法。将其视为void NONAME(var sender, var e) PlayMusicEvent(sender, e, musicNote); 的缩写形式,其中参数名称是从上下文中推断出来的,musicNote 是从局部变量中获取的。这一行创建了新方法,该方法使用您的方法并将其设置为计时器事件的处理程序。 如何删除这个eventHandler-= 不起作用。 @EruRōraito ***.com/questions/17995339/… 在这种情况下,无法取消订阅(正如 Yassine Houssni 所提到的)匿名方法。要取消订阅,您需要将事件处理程序对象 (ElapsedEventHandler) 存储在某处并取消订阅该实例。【参考方案2】:

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

myTimer.Elapsed += PlayMusicEvent;

在哪里

public void PlayMusicEvent(object sender, ElapsedEventArgs e)

    music.player.Stop();
    System.Timers.Timer myTimer = (System.Timers.Timer)sender;
    myTimer.Stop();

但您需要考虑将笔记存储在哪里。

【讨论】:

以上是关于将参数传递给 EventHandler [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 UITapGestureRecognizer [重复]

将任意数量的参数传递给Javascript函数[重复]

将方法作为参数传递给另一个方法[重复]

将参数传递给 Rake 任务中的方法 [重复]

将参数传递给自定义 UITableViewCell [重复]

python中的Typerror(),同时将参数传递给路由[重复]