0

好的,当我正要在这里发帖时,我解决了这个问题。我一直在寻找一种方法来区分类似 反射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 最终都为空。但是只能找到简单的 testEvt1 的支持文件,而不是 testEvt2。

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

4

1 回答 1

0

回答如上。您必须寻找具有相同名称的私有实例或静态(与相关事件相同)支持字段。

于 2013-07-12T16:34:49.597 回答