如果button.Click事件有任何处理程序关联,我如何检查C#? 如果(button.Click!= null)抛出编译错误。
答案 0 :(得分:17)
你做不到。事件只是暴露“添加处理程序”和“删除处理程序” - 这就是全部。 (实际上在CLR中,您还可以使用元数据将方法与“触发事件”相关联,但C#编译器永远不会生成。)某些事件发布者可能会提供其他方法来检查是否有任何订阅者(或者确实让你看到那些订阅者)但它不是事件模式本身的一部分。
有关详细信息,请参阅my article about events,或查看events标记(我将要添加到此问题中)。
答案 1 :(得分:1)
你为什么需要这个?背景是什么?也许有更好的方法来实现结果
该按钮是一个外部对象,你要做的就是检查它的内部用户列表,而不是询问它。这违反了封装..
您应始终让对象管理其公开的事件的订阅者。如果它希望客户端知道,它将暴露一个方法HasClientsRegistered。不要闯入。
答案 2 :(得分:0)
我认为你可以参加提升活动的课程。
您可以定义处理程序并枚举每个处理程序。
e.g。如果您的活动定义为
event System.EventHandler NewEvent;
然后在raise事件方法上你可以创建你可以做...
EventHandler handler = NewEvent;
if(handler != null)
{
handler(this, e);
}
这将为您提供处理程序,您可以从中获取调用列表。
答案 3 :(得分:0)
EventDescriptor e = TypeDescriptor.GetEvents(yourObject).Find(“yourEventName”,true);