我在一个类中定义了一个事件 如下  [Serializable]
    public abstract class IHeaderCollection : Collection<String>
    {
        public event CollectionChangeEventHandler ItemChanged ;
        public int num = 0;请问如何在另一个类中用反射获取ItemChanged 并且转换成CollectionChangeEventHandler 类型

解决方案 »

  1.   

    只能拿到EventInfo。
    EventInfo evet = typeof(IHeaderCollection).GetEvent("ItemChanged");
    反射只能拿到描述,然后用描述结合具体实例执行方法。
      

  2.   

    用EventInfo可以拿到。
    然后也可以挂上。不过动态挂事件很麻烦, 有的时候甚至要动态生成方法。拼IL.
    建议能绕开就绕开。
      

  3.   

    CSDN怎么上传附件?
    我刚好有个别人写的例子。
    不过没找到上传的地方。
      

  4.   


                EventInfo ei = typeof(IHeaderCollection).GetEvent("ItemChanged");
                Console.WriteLine(ei.EventHandlerType.Name);
      

  5.   

    注入一个Event只要一句话,给你写个demo:using System;
    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);
            }
        }
    }
      

  6.   

    就是EventInfo的这个方法: AddEventHandler。
      

  7.   

    EventInfo evt =类.GetType().GetEvent("",
                        BindingFlags.NonPublic | BindingFlags.Instance
                        | BindingFlags.Public
                    ); 
    evt.AddEventHandler(类, new EventHandler());