В.Net 4 этот код, выполненный без ошибки
class A
{
public event EventHandler<CustomEventArgs> MyEvent;
}
где CustomEventArgs, полученный из EventArgs
void Test()
{
A a = new A();
a.MyEvent += MyFunc;
}
void MyFunc(object sender, EventArgs args) // EventArgs expect of CustomEventArgs
{
}
Теперь, когда я пытаюсь сделать то же отражением, я добираюсь, не может бросить исключение делегата
EvemtInfo myEvent = ... // get event somehow
myEvent.AddEventHandler(a, new EventHandler<EventArgs>(ConnectResponseReceived));
Как я могу сделать то же это в отражении?
Вы можете использовать Delegate.CreateDelegate
, чтобы помочь здесь:
using System;
using System.Reflection;
namespace ConsoleApplication13
{
class Program
{
static void Main(string[] args)
{
A a = new A(); // the object *raising* the event
EventInfo evt = a.GetType().GetEvent("MyEvent");
B b = new B(); // the object *handling* the event (or null for static)
MethodInfo handler = b.GetType().GetMethod("ConnectResponseReceived");
Delegate del = Delegate.CreateDelegate(evt.EventHandlerType, b, handler);
evt.AddEventHandler(a, del);
a.OnMyEvent(); // test it
}
}
class A
{
public event EventHandler<CustomEventArgs> MyEvent;
public void OnMyEvent() {
var handler = MyEvent;
if(handler != null) handler(this, new CustomEventArgs());
}
}
class B
{
public void ConnectResponseReceived(object sender, EventArgs args)
{
Console.WriteLine("got it");
}
}
class CustomEventArgs : EventArgs { }
}
Чтобы получить событие:
EventInfo myEvent = this.GetType().GetEvent("MyEvent")
Чтобы вызвать делегата, попробуйте:
myEvent.AddEventHandler(a, new Delegate(this, "ConnectResponseReceived"));
(Фактически не тестировал, дайте мне знать, работает ли он! Кстати, ваш делегат выше может работать, если вы измените его на EventHandler
, не уверен.)
Группы методов ковариантны, поэтому MyFunc можно преобразовать в EventHandler
, но сами объекты делегатов - нет, поэтому EventHandler
не может быть. Вы можете использовать Delegate.CreateDelegate для создания делегата произвольного типа.
var handler = new EventHandler<EventArgs>(ConnectResponseReceived);
myEvent.AddEventHandler(a, Delegate.CreateDelegate
(myEvent.EventHandlerType, handler.Target, handler.Method));