2010-11-05 12 views
7

tengo una clase muy simple:suscribirse a un evento con la reflexión

class Trace 
{ 
    void WriteTrace() 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 

quiero esta clase se suscribe a un evento, por ejemplo, el evento de carga de un control de formulario. El control y evento son definir dinámicamente así que quiero utilizar la reflexión para hacer esto que estoy intentando algo así:

En mi clase de seguimiento que tengo este método:

public void SubscribeEvent (Control control) 
{ 
     if (type.IsAssignableFrom(control.GetType())) 
     { 
      Trace test = this; 
      MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

      // Subscribe to the event 
      EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 
      Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, control, method); // ERROR : Error binding to target method 

     } 
    } 
} 

Hay un error en el última línea: enlace de error al método de destino. ¿Qué hay de malo en mi fragmento?

¡Gracias!

EDIT: Ok, no hay más error pero cuando se genera el evento "Cargar" del formulario, el método WriteTrace no se llama (he puesto un punto de interrupción pero no se alcanza). Por qué ?

Lo siento por la edición, que funciona muy bien :)

+0

¿Por qué querrías usar Reflection si pudieras simplemente suscribirte/agregar un controlador al evento? 'control.Load + = HandlerHere;' ... Por otro lado, ¿eman tow rite 'Form' en lugar de' Control'? Porque primero estás hablando de un formulario. – Bobby

+0

Aquí hay solo un ejemplo, pero debería poder elegir el control y los eventos a seguir. – Florian

Respuesta

8

Con algunos cambios, pude ejecutar su muestra.

En primer lugar, el método de Trace debe tener una firma diferente para que se corresponda con el tipo EventHandler:

public class Trace 
{ 
    public void WriteTrace(object sender, EventArgs e) 
    { 
     Console.WriteLine("Trace !"); 
    } 
} 

A continuación, se hicieron algunos cambios a la SubscribeEvent:

public void SubscribeEvent(Control control) 
{ 
    if (typeof(Control).IsAssignableFrom(control.GetType())) 
    { 
     Trace test = this; 
     MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

     EventInfo eventInfo = control.GetType().GetEvent("Load"); 

     // Create the delegate on the test class because that's where the 
     // method is. This corresponds with `new EventHandler(test.WriteTrace)`. 
     Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, test, method); 
     // Assign the eventhandler. This corresponds with `control.Load += ...`. 
     eventInfo.AddEventHandler(control, handler); 
    } 
} 

espero que este ayuda

1

Su primera cuestión es que la firma método Trace.WriteTrace no coincide con la sintaxis Form.Load controlador de eventos

Prueba esto:

void WriteTrace(object sender, EventArgs e) 
{ 
    Console.WriteLine("Trace !"); 
} 

Además, su llamada a CreateDelegate tiene que pasar el objeto de seguimiento, no el objeto de control:

Trace test = this; 
MethodInfo method = typeof(Trace).GetMethod("WriteTrace"); 

// Subscribe to the event 
EventInfo eventInfo = control.GetType().GetEvent("Load"); // We suppose control is a form 

Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, method); // ERROR : Error binding to target method 
eventInfo.AddEventHandler(control, handler); 
Cuestiones relacionadas