2016-02-26 59 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); 
}