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来添加和删除事件的方法?我想知道一种方法,它不依赖于可能在将来更改的支持字段命名规则。
答案 0 :(得分:0)
上述答案。您必须查找具有相同名称的私有实例或静态(与所讨论的事件相同)支持字段。