C#事件处理程序

9

如何在C#中检查button.Click事件是否有任何处理程序关联? 如果(button.Click!= null)会抛出编译错误。

4个回答

18
你无法这样做。事件只公开“添加处理程序”和“删除处理程序” - 就是这样。 (实际上,在CLR中,您还可以具有与“触发事件”的方法相关联的元数据,但C#编译器从未生成该元数据。)一些事件发布者可能会提供其他手段来检查是否有任何订阅者(或者确实让您看到那些订阅者),但这不是事件模式本身的一部分。
请参见我的有关事件的文章以获取更多信息,或查看events标签(我即将将其添加到此问题)。

1

为什么你需要这个?背景是什么?也许有更好的方法来实现结果。
按钮是一个外部对象,你试图做的是在不询问它的情况下检查其内部订阅者列表。这违反了封装性原则。
你应该让对象管理它公开事件的订阅者。如果它想让客户端知道,它会公开一个名为HasClientsRegistered的方法。不要去打破它的封装。


0

我认为如果你在触发事件的类中,你就可以这样做。

你可以定义处理程序并枚举每个处理程序。

例如,如果你的事件被定义为

event System.EventHandler NewEvent;

然后在触发事件的方法中,您可以这样做...

    EventHandler handler = NewEvent;
    if(handler != null)
    {
      handler(this, e);
    }

这将会给你句柄,从而你可以获取调用列表。


要检查是否有任何订阅者,您只需要使用“if(NewEvent != null)”- 但这并不是真正从事件中获取它,而是从后备字段获取它。我的回答假定OP对其他事件感兴趣,考虑到“button.Click”示例。 - Jon Skeet

0

EventDescriptor e = TypeDescriptor.GetEvents(yourObject).Find("yourEventName", true);

事件描述符 e = TypeDescriptor.GetEvents(yourObject).Find("yourEventName", true);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接