2012-10-08 19 views
2

我有一個C#類,它引入了一個新的自定義事件類型,並允許用戶添加或刪除偵聽器。此外,我實現了一種方法,它可以在調度過程中刪除所有事件監聽器。未簽名所有事件偵聽器,C#代碼示例

public event EventHandler DataCommited; 

    private void DetatchListeners() 
    { 
     if (DataCommited != null) 
     { 
      foreach (EventHandler eh in DataCommited.GetInvocationList()) 
      { 
       DataCommited -= eh; 
      } 
     } 
    } 

可以實現將DataCommited事件作爲參數的方法。所以,我可以使用一種方法取消一組事件。我嘗試了很多方法來實現它,但不幸的是沒有做到這一點。我想知道這是否真的有可能以及如何。謝謝!!!

+0

http://stackoverflow.com/a/91853/894872會幫助你 – Eun

回答

2

可以實現將DataCommited事件作爲參數的方法。

嗯,不是真的。你可以拿一個EventInfo,但就是這樣。瞭解這一點很重要的是這樣一句話:

public event EventHandler DataCommited; 

實際創建件事:

  • 的事件,其代碼在其他類可以訂閱和
  • EventHandler類型的現場退訂,你可以使用它來調用處理程序,或單獨獲取每個處理程序。

更簡單的實現當前的代碼將僅僅是這樣的:

public event EventHandler DataCommited; 

private void DetatchListeners() 
{ 
    DataCommitted = null; 
} 

從現場般的事件退訂只是改變了字段的值,畢竟。

但是,如果您有EventInfo,則不知道該事件是如何實現的。它可能是可能是直接由字段支持 - 它可能不是......有沒有通常的方式來詢問當前處理程序的事件,或設置一個新的處理程序列表。 全部你可以直接用事件進行訂閱和取消訂閱。

如果您只使用類似字段的事件,則可以使用反射來查找字段的名稱並將該值設置爲null。一般來說,你不能這樣做。

有關更多信息,請參閱我的article on delegates and events

+0

謝謝你的回覆。它幫助了很多。我會繼續審閱文章。 – Vsevolod