AddEventHandler usando la reflexión

Tengo este código que no funciona:

public CartaoCidadao() { InitializeComponent(); object o = WebDAV.Classes.SCWatcher.LoadAssembly(); MethodInfo method = this.GetType().GetMethod("Inserted", BindingFlags.NonPublic | BindingFlags.Instance); EventInfo eventInfo = o.GetType().GetEvent("CardInserted"); Type type = eventInfo.EventHandlerType; Delegate handler = Delegate.CreateDelegate(type, this , method); eventInfo.AddEventHandler(o, handler); } void Inserted(string readerName, string cardName) { System.Windows.Forms.MessageBox.Show(readerName); } 

La tarjeta de evento insertada existe en otro archivo DLL y el objeto “o” carga OK. El controlador delegado tiene un valor después del efecto. Solo no puedo disparar el evento.

Aquí hay una muestra que muestra cómo adjuntar un evento utilizando la reflexión:

 class Program { static void Main(string[] args) { var p = new Program(); var eventInfo = p.GetType().GetEvent("TestEvent"); var methodInfo = p.GetType().GetMethod("TestMethod"); Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, p, methodInfo); eventInfo.AddEventHandler(p, handler); p.Test(); } public event Func TestEvent; public string TestMethod() { return "Hello World"; } public void Test() { if (TestEvent != null) { Console.WriteLine(TestEvent()); } } } 

Aquí hay un ejemplo corto pero completo que funciona:

 using System; using System.Reflection; class EventPublisher { public event EventHandler TestEvent; public void RaiseEvent() { TestEvent(this, EventArgs.Empty); } } class Test { void HandleEvent(object sender, EventArgs e) { Console.WriteLine("HandleEvent called"); } static void Main() { // Find the handler method Test test = new Test(); EventPublisher publisher = new EventPublisher(); MethodInfo method = typeof(Test).GetMethod ("HandleEvent", BindingFlags.NonPublic | BindingFlags.Instance); // Subscribe to the event EventInfo eventInfo = typeof(EventPublisher).GetEvent("TestEvent"); Type type = eventInfo.EventHandlerType; Delegate handler = Delegate.CreateDelegate(type, test, method); // Raise the event eventInfo.AddEventHandler(publisher, handler); publisher.RaiseEvent(); } } 

Ahora, cuando dices “No puedo disparar el evento”, ¿qué quieres decir exactamente? No está destinado a poder organizar eventos usted mismo; depende del editor del evento hacerlo. ¿Funciona todo el código que nos has presentado? Si es así, parece que no está agregando el controlador de eventos ese es el problema.

¿Podría dar más información?

Cuando dices que no funciona … ¿qué pasa? ¿Nada? ¿Una excepción?

Pensamientos:

  • ¿son públicos el evento y el controlador? De lo contrario, deberá pasar BindingFlags adecuados a las llamadas GetEvent / GetMethod .
  • ¿coincide la firma del controlador?

Este es un ejemplo de trabajo (tenga en cuenta que estoy usando un controlador estático, por lo tanto, el nulo en Delegate.CreateDelegate ):

 using System; using System.Reflection; class Test { public event EventHandler SomeEvent; public void OnSomeEvent() { if (SomeEvent != null) SomeEvent(this, EventArgs.Empty); } static void Main() { Test obj = new Test(); EventInfo evt = obj.GetType().GetEvent("SomeEvent"); MethodInfo handler = typeof(Test) .GetMethod("MyHandler"); Delegate del = Delegate.CreateDelegate( evt.EventHandlerType, null, handler); evt.AddEventHandler(obj, del); obj.OnSomeEvent(); } public static void MyHandler(object sender, EventArgs args) { Console.WriteLine("hi"); } }