C# 如何删除所有eventhandler

C# 如何删除所有eventhandler,c#,delegates,event-handling,C#,Delegates,Event Handling,假设我们有一名代表 public delegate void MyEventHandler(string x); 和事件处理程序 public event MyEventHandler Something; 我们添加了多个事件 for(int x = 0; x <10; x++) { this.Something += HandleSomething; } for(int x=0;x只需将事件设置为null: this.Something = null; 它将注销所有事件

假设我们有一名代表

public delegate void MyEventHandler(string x);
和事件处理程序

public event MyEventHandler Something;
我们添加了多个事件

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

for(int x=0;x只需将事件设置为
null

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

作为伪idea:


C#5我一直认为必须手动删除它们,但令人惊讶的是..这确实有效..我做了类似的事情--在我看来,在类的Dispose(bool)中,这种做法非常值得做方法,但我在任何地方都看不到这种做法的参考。我的想法正确吗?我认为这可能是个好主意,但你也应该小心不要使代码膨胀,这可能会导致错误,而不是修复它们。我有一种方法,我传入register和unregister操作,然后调用它执行的
Dispose
所有注销操作。@PieterGeerkensI认为这是不可能的,因为这个原因:或者在那个特殊情况下可能吗?@ForceMagic这是从类本身内部进行的。所以这是可能的。
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);
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();