如果我只有事件投掷者的类型myhandler
,如何使用反射添加事件处理程序AType
?
Delegate myhandler = SomeHandler;
EventInfo info= AType.GetEvent("CollectionChanged");
info.AddEventHandler( ObjectOfAType, myhandler )
答案 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}}中的事件类型)为特定对象上的给定方法创建适当的委托实例。