我在一个类中定义了一个事件 如下 [Serializable]
public abstract class IHeaderCollection : Collection<String>
{
public event CollectionChangeEventHandler ItemChanged ;
public int num = 0;请问如何在另一个类中用反射获取ItemChanged 并且转换成CollectionChangeEventHandler 类型
public abstract class IHeaderCollection : Collection<String>
{
public event CollectionChangeEventHandler ItemChanged ;
public int num = 0;请问如何在另一个类中用反射获取ItemChanged 并且转换成CollectionChangeEventHandler 类型
EventInfo evet = typeof(IHeaderCollection).GetEvent("ItemChanged");
反射只能拿到描述,然后用描述结合具体实例执行方法。
然后也可以挂上。不过动态挂事件很麻烦, 有的时候甚至要动态生成方法。拼IL.
建议能绕开就绕开。
我刚好有个别人写的例子。
不过没找到上传的地方。
EventInfo ei = typeof(IHeaderCollection).GetEvent("ItemChanged");
Console.WriteLine(ei.EventHandlerType.Name);
using System.ComponentModel;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = new B();
var y = new A { Target = x };
y.AttachEvent();
x.Test();
Console.ReadKey();
}
} public class A
{
public object Target; public void AttachEvent()
{
TypeDescriptor
.GetEvents(this.Target)
.Find("abc", false)
.AddEventHandler(this.Target, new B.myHandler(proc));
} private void proc(B sender)
{
Console.WriteLine("B的事件被A监听到!");
}
} public class B
{
public delegate void myHandler(B sender); public event myHandler abc; public void Test()
{
if (this.abc != null)
this.abc(this);
}
}
}
BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.Public
);
evt.AddEventHandler(类, new EventHandler());