C#事件处理程序

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

Solutions Collecting From Web of "C#事件处理程序"

你不能。 事件只是公开“添加处理程序”和“删除处理程序” – 这一切。 (事实上​​,在CLR中,你也可以有一个元数据来将一个方法与“触发事件”联系起来,但是C#编译器从来没有这样做)。一些事件发布者可以提供额外的方法来检查是否有任何订阅者你看到这些订户),但它不是事件模式本身的一部分。

查看我的关于事件的文章以获取更多信息,或查看事件标记(我将要添加到此问题中)。

你为什么需要这个? 什么是上下文? 也许有一个更好的方法来实现结果
该按钮是一个外部对象,你试图做的是检查它的内部订户列表,而不要求它。 这是违反封装
您应该始终让对象管理所公开事件的订阅者。 如果它希望客户端知道,它将暴露一个方法HasClientsRegistered。 不要打扰。

如果你是在课堂上提出这个事件,我认为你可以。

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

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

event System.EventHandler NewEvent; 

然后在提高事件的方法,你可能会创建你可以做…

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

这将给你的处理程序,并从中你可以得到调用列表。

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