【发布时间】:2008-10-24 08:50:35
【问题描述】:
如果 button.Click 事件有任何关联的处理程序,我如何检查 C#? If (button.Click != null) 抛出编译错误。
【问题讨论】:
如果 button.Click 事件有任何关联的处理程序,我如何检查 C#? If (button.Click != null) 抛出编译错误。
【问题讨论】:
你不能。事件只是公开“添加处理程序”和“删除处理程序”——仅此而已。 (事实上,在 CLR 中,您还可以使用元数据将方法与“触发事件”相关联,但 C# 编译器从不生成它。)一些事件发布者可能会提供额外的方法来检查是否有任何订阅者(或者确实让您会看到那些订阅者),但它不是事件模式本身的一部分。
有关更多信息,请参阅my article about events,或查看events 标签(我将在此问题中添加该标签)。
【讨论】:
为什么需要这个?上下文是什么?也许有更好的方法来实现结果
该按钮是一个外部对象,您要做的是检查它的内部订阅者列表而不询问它。它违反了封装..
您应该始终让对象管理它公开的事件的订阅者。如果它想让客户知道,它会公开一个 HasClientsRegistered 方法。不要闯入。
【讨论】:
如果你在引发事件的班级,我想你可以。
您可以定义处理程序并枚举每个处理程序。
例如如果您的事件被定义为
event System.EventHandler NewEvent;
然后在你可能创建的 raise 事件方法上你可以做...
EventHandler handler = NewEvent;
if(handler != null)
{
handler(this, e);
}
这将为您提供处理程序,您可以从中获取调用列表。
【讨论】:
EventDescriptor e = TypeDescriptor.GetEvents(yourObject).Find("yourEventName", true);
【讨论】: