2016-03-18 26 views
7

consente di dire che abbiamo un delegatoCome rimuovere tutti eventhandler

public delegate void MyEventHandler(string x); 

e un gestore di eventi

public event MyEventHandler Something; 

aggiungiamo più eventi ..

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

La mia domanda è .. come si rimuovono tutti i metodi dall'eventhandler presumendo che uno non sappia che è stato aggiunto 10 volte (o più o meno)?

risposta

17

semplicemente impostare l'evento per null:

this.Something = null; 

Sarà annullare la registrazione di tutti i gestori di eventi.

+0

Ho sempre pensato che dovessimo rimuoverli manualmente, ma sorprendentemente .. questo funziona .. Ho fatto qualcosa di simile la risposta accettata su http://stackoverflow.com/questions/447821/how-do-i- annullare l'iscrizione-tutti-gestori-da-un-evento-per-un-particolare-classe-in-c – Eminem

+0

Mi sembra che questa pratica valga la pena fare all'interno di un metodo Dispose (bool) di classe, ma io non vedere i riferimenti a questa pratica ovunque. Il mio suono pensante? –

+1

Penso che potrebbe essere una buona idea, ma dovresti fare attenzione a non gonfiare il tuo codice, il che potrebbe finire per portare a bug invece di risolverli. Ho un metodo in cui passo il registro e annullo la registrazione e chiamando 'Dispose' esegue tutte le azioni di annullamento della registrazione. @PieterGeerkens –

0

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

     } 

    } 

Uso:

MyDelegate.RemoveEventHandlers();