好的,当我正要在这里发帖时,我解决了这个问题。我一直在寻找一种方法来区分类似 反射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 来添加和删除事件的方法?我想知道一种不依赖于将来可能会更改的支持字段命名规则的方法。