2012-10-01 46 views
1

假设我有一个类说视图模式类mvvm。然后为这个虚拟机创建一些事件处理程序。那么它可以被许多其他情况使用。如何检测事件处理程序并发布它?

所以,如果我有一个myvm的实例,我想检测是否有任何事件处理程序挂钩,并希望释放它的内存问题。

什么是通过myvm完成此操作的通用方式,例如,我可能没有myvm的源代码?

+0

你想释放什么,事件处理程序或myvm? – CrazyCasta

回答

2

事件的设计使得声明它们的类之外的代码无法访问底层代理。例如,根据一节中的C# Language specification(重点煤矿)“10.8事件”:

在以下形式的运算x + = y或x - = Y,当x是一个事件和 基准取在包含声明x的类型之外的位置,操作结果的类型为void(因为 与具有x的类型相反,其中 赋值后x的值)。 此规则禁止从外部代码中间接地检查事件的基础代理 。

因此,找出什么订阅了课外活动,充其量只能是“解决办法”。

如果你能够访问包含该事件类的源和你想跟踪迷上了代表到event,实现在事件定义和manually keep track of them in a Dictionaryaddremove关键字。

0

如果我理解正确。 该类封装了我使用SocketAsyncEventArgs进行说明的未知myvm类,显然,我们没有SocketAsyncEventArgs类的源代码。

而且我封装了SocketAsyncEventArgs类的Completed事件。当该事件被触发时,_instance_Completed将被触发,然后_myvm事件将被触发。所以我们需要做的是订阅/取消订阅_myvm事件。

然后,我离开一个人们订阅/取消订阅_myvm事件的事件,作为订阅/取消订阅,代表被存储到列表中,因此您可以通过调用ClearEvents()方法来清除 。

希望它会有所帮助。

public class WrapperClass 
    { 
     private EventHandler<SocketAsyncEventArgs> _myEvent; 
     private SocketAsyncEventArgs _myvm; 
     private List<Delegate> delegates; 

     public WrapperClass() 
     { 
      delegates = new List<Delegate>(); 
     } 

     public void SetInstance(SocketAsyncEventArgs myvm) 
     { 
      _myvm = myvm; 
      _myvm.Completed += new EventHandler<SocketAsyncEventArgs>(_instance_Completed); 
     } 

     private void _instance_Completed(object sender, SocketAsyncEventArgs e) 
     { 
      if (_myEvent != null) 
      { 
       _myEvent(sender, e); 
      } 
     } 

     public event EventHandler<SocketAsyncEventArgs> myEvent 
     { 
      add 
      { 
       delegates.Add(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Combine(_myEvent, value); 
      } 
      remove 
      { 
       delegates.Remove(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, value); 
      } 
     } 

     public void ClearEvents() 
     { 
      foreach (var d in delegates) 
      { 
      _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, d); 
      } 
     } 
    } 
相关问题