¿Cómo anulo el registro de todos los controladores para un evento de formulario?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Tengo 2 controladores que usan el mismo formulario. ¿Cómo elimino los controladores antes de agregar el nuevo (C #)?

¿Fue útil?

Solución

Si está trabajando en el formulario en sí, debería poder hacer algo como:

PseudoCode:

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

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

Desde fuera del formulario, su SOL.

Otros consejos

Si sabe cuáles son esos controladores, simplemente elimínelos de la misma manera que se suscribió a ellos, excepto con - = en lugar de + =.

Si no sabe cuáles son los controladores, no puede eliminarlos; la idea es que la encapsulación del evento impide que una parte interesada altere los intereses de otra clase al observar un evento.

EDITAR: he asumido que estás hablando de un evento implementado por una clase diferente, p. un control. Si su clase "posee" el evento, luego establezca la variable relevante en nulo.

Me doy cuenta de que esta pregunta es bastante antigua, pero espero que ayude a alguien. Puede cancelar el registro de todos los controladores de eventos para cualquier clase con un poco de reflexión.

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);
                }
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top