Come posso annullare la registrazione di tutti i gestori per un evento del modulo?

StackOverflow https://stackoverflow.com/questions/287663

  •  08-07-2019
  •  | 
  •  

Domanda

Ho 2 gestori che usano lo stesso modulo. Come rimuovo i gestori prima di aggiungere quello nuovo (C #)?

È stato utile?

Soluzione

Se stai lavorando nel modulo stesso, dovresti essere in grado di fare qualcosa del tipo:

Pseudocodice:

Delegate[] events = Form1.SomeEvent.GetInvokationList();

foreach (Delegate d in events)
{
     Form1.SomeEvent -= d;
}

Dall'esterno del modulo, il tuo SOL.

Altri suggerimenti

Se sai cosa sono questi gestori, rimuovili nello stesso modo in cui ti sei abbonato a loro, tranne con - = anziché + =.

Se non sai cosa sono i gestori, non puoi rimuoverli - l'idea è che l'incapsulamento di eventi impedisce a una parte interessata di ostacolare gli interessi di un'altra classe nell'osservare un evento.

EDIT: suppongo che tu stia parlando di un evento implementato da una classe diversa, ad es. un controllo. Se la tua classe "possiede" l'evento, quindi basta impostare la variabile rilevante su null.

Mi rendo conto che questa domanda è piuttosto vecchia, ma spero che possa aiutare qualcuno. Puoi annullare la registrazione di tutti i gestori di eventi per qualsiasi classe con una piccola riflessione.

public static void UnregisterAllEvents(object objectWithEvents)
{
    Type theType = objectWithEvents.GetType();

    //Even though the events are public, the FieldInfo associated with them is private
    foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))
    {
        //eventInfo will be null if this is a normal field and not an event.
        System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name);
        if (eventInfo != null)
        {
            MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate;
            if (multicastDelegate != null)
            {
                foreach (Delegate _delegate in multicastDelegate.GetInvocationList())
                {
                    eventInfo.RemoveEventHandler(objectWithEvents, _delegate);
                }
            }
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top