How to remove all eventhandler

前端 未结 2 1705
刺人心
刺人心 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(MulticastDelegate m, Expression> 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();
    

提交回复
热议问题