使用Reflection添加事件处理程序? /获取类型的对象?

时间:2018-03-27 12:02:51

标签: c# events reflection

如果我只有事件投掷者的类型myhandler,如何使用反射添加事件处理程序AType

Delegate myhandler = SomeHandler;

EventInfo info= AType.GetEvent("CollectionChanged");

info.AddEventHandler( ObjectOfAType, myhandler )

1 个答案:

答案 0 :(得分:1)

基本上,你拥有的很好。唯一的问题是using System; using System.Collections.Specialized; using System.Reflection; class Program { static void Main() { Type AType = typeof(Foo); var ObjectOfAType = new Foo(); Delegate myhandler = (NotifyCollectionChangedEventHandler)SomeHandler; EventInfo info = AType.GetEvent("CollectionChanged"); info.AddEventHandler(ObjectOfAType, myhandler); // prove it works ObjectOfAType.OnCollectionChanged(); } private static void SomeHandler(object sender, NotifyCollectionChangedEventArgs e) => Console.WriteLine("Handler invoked"); } public class Foo { public void OnCollectionChanged() => CollectionChanged?.Invoke(this, null); public event NotifyCollectionChangedEventHandler CollectionChanged; } 实际上需要是正确的类型,也就是说:事件定义的类型。

例如:

Delegate.CreateDelegate()

MethodInfo方法接受委托类型,对象实例和EventInfo info方法;您可以使用它(使用{{1}}中的事件类型)为特定对象上的给定方法创建适当的委托实例。