如何移除所有事件处理程序

13

假设我们有一个委托

public delegate void MyEventHandler(string x);

和事件处理程序

public event MyEventHandler Something;

我们添加了多个事件...

for(int x = 0; x <10; x++)  
{
   this.Something += HandleSomething;
}

我的问题是,如果假设一个事件处理程序已经被添加了10次(或更多或更少),那么如何删除所有的方法?

2个回答

26

将事件简单地设置为null

this.Something = null;
它将注销所有事件处理程序。

它将注销所有事件处理程序。


2
我一直以为必须手动删除它们,但令人惊讶的是...这确实有效...我做了类似于https://dev59.com/y3RB5IYBdhLWcg3w-8A9上被接受的答案。 - Eminem
1
在我的看法中,在类的Dispose(bool)方法内执行这种做法非常值得,但我没有看到任何关于这种做法的参考。我的想法正确吗? - Pieter Geerkens
1
我认为这可能是一个不错的主意,但你应该小心不要让你的代码变得过于庞大,否则可能会导致修复错误的时候产生更多的bug。我有一种方法,在其中我传递注册和注销操作,并在调用Dispose时执行所有的注销操作。@PieterGeerkens - Patrick Hofman
我原本认为这是不可能的,因为这个:https://dev59.com/FnVC5IYBdhLWcg3w4Vf6#153744。或者在那种特殊情况下是可能的吗? - ForceMagic
@ForceMagic 这是在类内部的。所以是可能的。 - Patrick Hofman
那太好了,我会试一下!谢谢。 - ForceMagic

0

作为伪代码的想法:

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接