c# - 如何将事件传递给方法然后订阅它?

标签 c# .net events delegates

事件处理器

public void DeliverEvent(object sender, EventArgs e)
{

}

#1:这行得通

public void StartListening(Button source)
{
    source.Click += DeliverEvent;
}

#2:这也是..

public void StartListening(EventHandler eventHandler)
{
    eventHandler += DeliverEvent;
}

但是在#2 中,你不能调用这个方法,因为如果你尝试这样的事情:

StartListening(button.Click);

你得到这个错误:

“System.Windows.Forms.Control.Click”事件只能出现在 += 或 -= 的左侧

有什么办法可以解决这个错误吗?我希望能够将事件而不是包含事件的对象传递给 StartListening 方法。

最佳答案

您正在将事件与委托(delegate)混合在一起。您可能应该阅读 this Jon Skeet 的文章将解释两者之间的区别。

第二个选项不起作用的原因是因为该方法需要一个参数,该参数是一个符合 EventHandler 签名的委托(delegate)。Button.Click 指的是一个事件而不是委托(delegate)。事件只是封装委托(delegate)。

我不确定您正在尝试的事情是否可以完成。从概念上讲,您想做的事情实际上没有意义;您要传递的是处理程序 的逻辑,而不是事件 本身。

看看this帖子着眼于一些模拟您想要的效果的方法。

关于c# - 如何将事件传递给方法然后订阅它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13445285/

相关文章:

c# - 如何序列化 System.Timers.Timer

c# - 如何将带有where子句的多个SQL LEFT JOIN语句转换为LINQ

c# - 将 IoC 容器引入遗留代码

c# - 这 2 个 LINQ 连接查询实现相同的效果吗

javascript - 从 API (elgg) 查找并提取数据

c# - 如何在 Xamarin 表单 slider 控件中显示刻度线

c# - 当本地服务帐户在服务中运行时,并非有关 Process.GetProcesses 中进程的所有信息

iphone - 如何模拟触摸事件?

c# - 将 DateTime 从英语转换为西类牙语

jQuery 事件目标子元素