将参数传递给 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
需要特定签名的方法(带有参数object
和EventArgs
)。如果您想使用 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 [重复]