Вот пример от 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
И вы же понимаете, что сигнатура делегата должна соответствовать сигнатуре события? Как попало назначать обработчики событиям не получится.