C#events - 用于反映区分简单事件和添加{...} remove {...}的任何方式?

时间:2013-07-12 16:33:46

标签: c# events reflection add compiler-generated

哦,我正准备在这里发帖时,我解决了这个问题。 我正在寻找一种方法来区分event Action testEvt1;event Action testEvt1 { add { } remove { }}之类的反射,因为它们最终都是一对add_testEvt1 remove_testEvt1方法。令人惊讶的是,CompilerGeneratedAttribute在这里没有帮助。

解决方案原来是寻找与事件同名的私人支持 - 编译器只为简单事件生成一个,并且不会让你有其他同名字段。

正如代码所示:

class Program
    {
        static void Main(string[] args)
        {
            EventInfo evt1 = typeof(a).GetEvent("testEvt1");
            EventInfo evt2 = typeof(a).GetEvent("testEvt2");

            var evt1Attrib = Attribute.GetCustomAttribute(evt1, typeof(CompilerGeneratedAttribute));
            var evt2Attrib = Attribute.GetCustomAttribute(evt2, typeof(CompilerGeneratedAttribute));

            var evt1Backfield = typeof(a).GetField(evt1.Name,BindingFlags.NonPublic | BindingFlags.Instance);
            var evt2Backfield = typeof(a).GetField(evt2.Name, BindingFlags.NonPublic | BindingFlags.Instance);
        }
    }

    public class a
    {
        //private Action testEvt1;
        public event Action testEvt1;
        public event Action testEvt2
        {
            add { }
            remove { }
        }
    }

evt1Attrib和evt2Attrib都以null结尾。但是只能为简单的testEvt1而不是testEvt2找到支持文件。

我决定发布这个,如果其他人碰巧遇到同样的问题并且可能会问,有没有人知道一种更简单的方法来区分testEvt1和testEvt2以及编译器为什么不添加CompilerGeneratedAttribute来添加和删除事件的方法?我想知道一种方法,它不依赖于可能在将来更改的支持字段命名规则。

1 个答案:

答案 0 :(得分:0)

上述答案。您必须查找具有相同名称的私有实例或静态(与所讨论的事件相同)支持字段。