English 中文(简体)
C# 事件处理程序
原标题:
  • 时间:2008-10-24 08:50:35
  •  标签:

How can I check in C# if button.Click event has any handlers associated? If (button.Click != null) throws compile error.

问题回答

你不能这样做。事件只暴露“添加处理程序”和“移除处理程序” - 这就是全部。 (实际上,在CLR中,您还可以使用元数据将方法与“触发事件”相关联,但C#编译器从不生成该元数据。)一些事件发布者可能提供其他方法来检查是否有任何订阅者(或许让您看到这些订阅者),但这不是事件模式本身的一部分。

请参阅有关事件的文章获取更多信息,或查看事件标签(我即将将其添加到此问题中)。

Why do you need this? What is the context? Maybe there s a better way to achieve the result
The button is an external object and what you re trying to do is check is its internal list of subscribers without asking it. It s violating encapsulation..
You should always let the object manage the subscribers for the events it exposes. If it wanted clients to be aware, it would have exposed a method HasClientsRegistered. Don t break in.

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

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

例如,如果您的活动被定义为

event System.EventHandler NewEvent;

然后在触发事件方法中,您可以创建并执行...

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

那将给你处理程序,从那里你可以获取调用列表。

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





相关问题
热门标签