добавьте обработчик использованием отражения наследование EventArg

В.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));

Как я могу сделать то же это в отражении?

1
задан sth 23 July 2010 в 01:27
поделиться

3 ответа

Вы можете использовать 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 { }
}
2
ответ дан 2 September 2019 в 22:51
поделиться

Чтобы получить событие:

EventInfo myEvent = this.GetType().GetEvent("MyEvent")

Чтобы вызвать делегата, попробуйте:

myEvent.AddEventHandler(a, new Delegate(this, "ConnectResponseReceived"));

(Фактически не тестировал, дайте мне знать, работает ли он! Кстати, ваш делегат выше может работать, если вы измените его на EventHandler (ConnectResponseReceived) , не уверен.)

0
ответ дан 2 September 2019 в 22:51
поделиться

Группы методов ковариантны, поэтому MyFunc можно преобразовать в EventHandler , но сами объекты делегатов - нет, поэтому EventHandler не может быть. Вы можете использовать Delegate.CreateDelegate для создания делегата произвольного типа.

var handler = new EventHandler<EventArgs>(ConnectResponseReceived);
myEvent.AddEventHandler(a, Delegate.CreateDelegate
    (myEvent.EventHandlerType, handler.Target, handler.Method));
0
ответ дан 2 September 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: