2012-02-16 69 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