Не создается делегат для EventHandler<TEventArgs>

Рейтинг: -1Ответов: 1Опубликовано: 29.07.2023

Я пытаюсь создать делегат для EventHandler, но в обобщенном случае. Т.е. я ищу по названию событие, метод, и

var del = Delegate.CreateDelegate(handlerType, action);

action, это MethodInfo для

public void OnMD(object sender, MouseMoveEventArgse)
{
    Console.WriteLine("Here");
}

само событие это

public event EventHandler<MouseMoveEventArgs> MouseEnter;

В итоге после первого кода вылезает:

System.ArgumentException: "Cannot bind to the target method because its signature is not compatible with that of the delegate type."

Как можно это исправить?

Ответы

▲ 1Принят

Вот пример от Microsoft с добавлением вашего типа:

using System.Reflection;
public class Base {}
public class Derived : Base {
    public static Derived MyMethod(Base arg) {
            Base dummy = arg;
            Console.WriteLine("MyMethod");
            return new Derived();
        }
    public static void A(object o, MouseMoveEventArgs e) {
            Console.WriteLine("A");
        }
}
public class MouseMoveEventArgs {}
public delegate Base Example(Derived arg);
public class bp {
    static void Main() {
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;
        MethodInfo minfo = typeof(Derived).GetMethod("MyMethod", flags);
        var ex1 = (Example)Delegate.CreateDelegate(typeof(Example), minfo);
        Base b = ex1(new Derived());
        minfo = typeof(Derived).GetMethod("A");
        var ex2 =
            (EventHandler<MouseMoveEventArgs>)Delegate.CreateDelegate(typeof(EventHandler<MouseMoveEventArgs>), minfo);
        ex2(new object(), new MouseMoveEventArgs());
    }
}

Работает. Возможно, у вас не хватает знака '?' (я сделал пример на FW 4.8 c# 5):

public void OnMD(object? sender, MouseMoveEventArgs e)

UPD Ну, тогда так (насколько я понял вашу задачу):

using System;
using System.Reflection;
public class I {
    int _i;
    public int iI { get { return _i; } set { _i = value; SetEvt(new object(), _i); } }
    public int Inc() { _i++; IncEvt(new object(), _i.ToString()); return _i; }
    public int Dec() { _i--; DecEvt(new object(), new EventArgs()); return _i; }
    public event EventHandler<int> SetEvt;
    public event EventHandler<string> IncEvt;
    public event EventHandler DecEvt;
}
public class EventHandlers {
    public void M1(object o, int e) { Console.WriteLine("M1: {0}", e); }
    public void M2(object o, int e) { Console.WriteLine("M2: {0}", e); }
    public void M3(object o, string e) { Console.WriteLine("M3: {0}", e); }
    public void M4(object o, string e) { Console.WriteLine("M4: {0}", e); }
    public void M5(object o, EventArgs e) { Console.WriteLine("M5"); }
    public void M6(object o, EventArgs e) { Console.WriteLine("M6"); }
}
public class bp {
    static void Main() {
        var evts = new string[] { "SetEvt", "IncEvt", "DecEvt" };
        var hndlrs = new string[] { "M1", "M2", "M3", "M4", "M5", "M6" };
        var i = new I(); var ehs = new EventHandlers();
        var ei = typeof(I).GetEvent(evts[0]);
        ei.AddEventHandler(i
            , Delegate.CreateDelegate(ei.EventHandlerType, ehs, hndlrs[1], true));
        i.iI = 3;
        ei = typeof(I).GetEvent(evts[1]);
        ei.AddEventHandler(i
            , Delegate.CreateDelegate(ei.EventHandlerType, ehs, hndlrs[2], true));
        ei.AddEventHandler(i
            , Delegate.CreateDelegate(ei.EventHandlerType, ehs, hndlrs[3], true));
        i.Inc();
        ei = typeof(I).GetEvent(evts[2]);
        ei.AddEventHandler(i
            , Delegate.CreateDelegate(ei.EventHandlerType, ehs, hndlrs[5], true));
        i.Dec();
    }
}

-->

M2: 3

M3: 4

M4: 4

M6

И вы же понимаете, что сигнатура делегата должна соответствовать сигнатуре события? Как попало назначать обработчики событиям не получится.