2016-02-26 92 views
0

添加处理器检查事件处理程序连接到与事件

if(!ClickHandled) 
    this.Click += (s, e) =>{ } 

删除处理程序:

if(ClickHandled) 
    this.Click -= (s, e) =>{ } 

有没有办法知道是否已经有连接到事件处理程序控制(并可能获取它们的列表,例如获取点击事件的事件处理程序列表)?

+0

如果您有权访问暴露事件的那个类的源,那么您可以使用委托来获取所有事件处理程序....但是如果您想要使用内置控件执行此操作...那么上面提到的反射链接可以使用 – Viru

+3

可能是XY问题。为什么你需要知道处理程序的数量?事件是一种发出信号的方式,如果有用户或没有用户,它应该没有关系。 – Sinatr

+0

以及我有权访问类的来源 –

回答

1

您可以实现从EventHandler继承的类。对于这个类,你可以实现你想要的任何额外的行为。例如,您可以创建一个将保存对象事件映射的集合,并且可以实现搜索给定对或模式的方法。

0

你可以这样做,假设你有权访问类的源。谨防这种方式,你放弃了何时将所有代表召集给班上的客户的控制,这不是一个好主意。如果您没有查找eventhandler的列表,但只想知道是否订阅了事件。或许您可以使用另一种方法,该方法仅告知是否任何人订阅了点击事件。

class MyButton 
    { 
    delegate void ClickHandler(object o ,EventArgs e); 
    public event ClickHandler Click; 
    ...... 

     public List<ClickHandler> ClickHandlerList 
     { 
     get 
      { 
       return ClickHandler.GetInovationList().Cast<ClickHandler>().ToList(); 
      } 
     } 

     public bool IsClickEventSubcribed 
     { 
     get 
      { 
       return ClickHandler.GetInovationList().Cast<ClickHandler>().Any(); 
      } 
     } 
    } 
-1

如果这样做的目的是停止向事件监听器发送信号,那么通过支票来发送信号是不是更容易?

if (NotifyingEnabled) 
{ 
    SomeEvent.Raise(this); 
}