如何删除所有eventhandler
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何删除所有eventhandler相关的知识,希望对你有一定的参考价值。
让我们说我们有一个代表
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();
以上是关于如何删除所有eventhandler的主要内容,如果未能解决你的问题,请参考以下文章
为 UIBarButtonItem 添加/删除 EventHandler
如何将 eventHandlers 和 uploadEvntHandlers 与 angularjs 1 http 请求一起使用?
当sqlite android片段中的数据更改或删除时如何刷新recyclerview?
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段