How to remove all eventhandler

前端 未结 2 1697
刺人心
刺人心 2021-01-04 08:01

Lets say we have a delegate

public delegate void MyEventHandler(string x);

and an event handler

public event MyEventHandler         


        
相关标签:
2条回答
  • 2021-01-04 08:39

    As pseudo idea:

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

    Usage:

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

    Usage:

    MyDelegate.RemoveEventHandlers();
    
    0 讨论(0)
  • 2021-01-04 09:01

    Simply set the event to null:

    this.Something = null;
    

    It will unregister all event handlers.

    0 讨论(0)
提交回复
热议问题