假设我们有一个委托
public delegate void MyEventHandler(string x);
和事件处理程序
public event MyEventHandler Something;
我们添加了多个事件...
for(int x = 0; x <10; x++)
{
this.Something += HandleSomething;
}
我的问题是,如果假设一个事件处理程序已经被添加了10次(或更多或更少),那么如何删除所有的方法?
假设我们有一个委托
public delegate void MyEventHandler(string x);
和事件处理程序
public event MyEventHandler Something;
我们添加了多个事件...
for(int x = 0; x <10; x++)
{
this.Something += HandleSomething;
}
我的问题是,如果假设一个事件处理程序已经被添加了10次(或更多或更少),那么如何删除所有的方法?
将事件简单地设置为null
:
this.Something = null;
它将注销所有事件处理程序。
它将注销所有事件处理程序。
作为伪代码的想法:
C#5 <
class MyDelegateHelperClass{
public static void RemoveEventHandlers<TModel, TItem>(MulticastDelegate m, Expression<Func<TModel, TItem>> expr) {
EventInfo eventInfo= ((MemberExpression)expr.Body).Member as EventInfo;
Delegate[] subscribers = m.GetInvocationList();
Delegate currentDelegate;
for (int i = 0; i < subscribers.Length; i++) {
currentDelegate=subscribers[i];
eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate);
}
}
}
使用方法:
MyDelegateHelperClass.RemoveEventHandlers(MyDelegate,()=>myClass.myDelegate);
C#6
public static void RemoveEventHandlers(this MulticastDelegate m){
string eventName=nameof(m);
EventInfo eventInfo=m.GetType().ReflectingType.GetEvent(eventName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
Delegate[] subscribers = m.GetInvocationList();
Delegate currentDelegate;
for (int i = 0; i < subscribers.Length; i++) {
currentDelegate=subscribers[i];
eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate);
}
}
使用方法:
MyDelegate.RemoveEventHandlers();
Dispose
时执行所有的注销操作。@PieterGeerkens - Patrick Hofman