2012-01-09 12 views
5

Cómo obtener la lista de delegados formulario evento del control en WPF.Cómo obtener la lista de invocación de cualquier evento

He probado el siguiente código pero va a devolver la información de campo como nulo

TextBox cont = new TextBox(); 
cont.TextChanged += new TextChangedEventHandler(cont_TextChanged); 
FieldInfo fi = cont.GetType().GetField("TextChanged", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static); 
Delegate del = (Delegate)fi.GetValue(cont); 
+0

posible duplicado de [¿Cómo puedo obtener una lista de los delegados subyacentes de un evento utilizando la reflexión?] (Http://stackoverflow.com/questions/6501288/how-can-i -get-a-list-of-the-underlying-deletes-from-an-event-using-reflection) – Heinzi

Respuesta

5

No sé por qué la gente dice que no es posible:

Digamos que usted desea desactivar cualquier caso temporal , se puede crear un método como este:

static Delegate[] DisableEvents(this Control ctrl, string eventName) 
{ 
     PropertyInfo propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); 
     EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList; 
     FieldInfo fieldInfo = typeof(Control).GetField("Event"+eventName, BindingFlags.NonPublic | BindingFlags.Static); 

     object eventKey = fieldInfo.GetValue(ctrl); 
     var eventHandler = eventHandlerList[eventKey] as Delegate; 
     Delegate[] invocationList = eventHandler.GetInvocationList(); 
     foreach (EventHandler item in invocationList) 
     { 
      ctrl.GetType().GetEvent(eventName).RemoveEventHandler(ctrl, item); 
     } 
     return invocationList; 

}| 

se le puede llamar así:

var events = textbox1.DisableEvents("GotFocus") 

Si quiere volver a agregarlos, solo tiene que ir a la lista de eventos.

+0

¿Qué quieres decir con esa frase final, "solo revisa la lista de eventos"? –

+0

Quise decir que puede repetir la lista que obtuvo en el método DisableEvents y Agregar esos eventos nuevamente. Pero en realidad ahora hay una manera más fácil de hacer eso y es llamando a GetInvocationList para recuperar a todos los delegados. –

+0

¡Funciona para mí! Probado con un simple evento Control.Click. +1 – Alex

0

El enfoque descrito en la respuesta anterior funciona perfectamente. Sin embargo, para usarlo, debe asegurarse de que el evento se implemente no como un campo, sino como una propiedad. Al mismo tiempo, la referencia al delegado se almacena en el objeto interno de la clase Dictionary. Puede leer más aquí: How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

Cuestiones relacionadas