2012-02-16 99 views
0

我有一個可以發佈事件的objectRaiser,例如事件「PropertyChanged」。 我也有另一個objectListener,它偵聽來自第一個objectRaiser的引發事件。.NET - 從對象中刪除所有偵聽器事件處理程序

如何從objectRaiser實例中刪除由objectListener偵聽的事件處理程序?

我需要重複一些重要的事情:刪除的事件處理程序來自objectListener。不適用於我從objectRaiser中刪除所有發佈。我在另一個問題上看,但似乎不解決我的問題。

非常感謝您的幫助。

回答

0

從內objectRaiser

MyEvent = null; 

從外:你不能,因爲你沒有訪問到存儲處理程序委託。但是,您可以在objectRaiser中添加一個公開的ClearHandlers()方法,然後從任意位置調用它。

+0

基於這個問題,我認爲我希望刪除某個特定用戶的所有代表,而不是全部。 – cadrell0 2012-02-16 18:22:50

0

我不知道如果這正是你追求......但在下面的代碼是什麼,我們可以使用Reflection從包含在ObjectListenerObjectRaiser的實例中刪除處理程序:

namespace ObjectEvents 
{ 
    class Program 
    { 
     private class ObjectRaiser 
     { 
      public event EventHandler PropertyChange; 

      private string name; 
      public string Name 
      { 
       get 
       { 
        return name; 
       } 
       set 
       { 
        name = value; 
        PropertyChange(this, new EventArgs()); 
       } 
      } 
     } 

     private class ObjectListener 
     { 
      private ObjectRaiser or; 

      public ObjectListener(ObjectRaiser or) 
      { 
       this.or = or; 
       or.PropertyChange += new EventHandler(PropertyChange); 
      } 

      public void PropertyChange(object sender, EventArgs e) 
      { 
       Console.WriteLine("I'm listening!"); 
      } 

      public void RemoveHandlers() 
      { 
       var lfi = or.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

       foreach(var fi in lfi) 
       { 
        var eh = fi.GetValue(or) as EventHandler; 
        if (eh != null) 
        { 
         foreach (var del in eh.GetInvocationList()) 
         { 
          foreach (var ev in or.GetType().GetEvents()) 
          { 
           ev.GetRemoveMethod().Invoke(or, new object[] { del }); 
          } 
         } 
        } 
       } 
      } 
     } 

     static void Main(string[] args) 
     { 
      var or = new ObjectRaiser(); 
      var ol = new ObjectListener(or); 

      //This will raise the event 
      or.Name = "New Name"; 
      ol.RemoveHandlers(); 
      //This will throw an exception because the event has no handler associated 
      or.Name = "Weird Name"; 

      Console.ReadLine(); 
     } 
    } 
} 

注意:這是一個非常簡單的例子,當然需要對現實世界的使用進行重大修改。

+0

該代碼似乎從所有偵聽器中刪除了他的事件「PropertyChange」的所有活動處理程序,但我們只想從具體的objectListener實例中刪除所有處理程序。 – nullPointer 2012-02-17 09:13:13