C#学习教程:反射:从PropertyInfo获取FieldInfo(如果它有一个)以便使用它的FieldInfo对象。现在,我知道你可以使用.IsDefined(typeof(CompilerGeneratedAttribute),false);在FieldInfo上查看它是否是自动生成的,所以我假设属性类似于自动生成的字段?干杯,Ed属性的get_和set_方法也将CompilerGeneratedAttributed应用于它们。虽然属性之间没有强耦合,但自动属性的支持字段有一个命名约定:publicstringFoo{get;set;}产生一个私有字符串k__BackingField成员(并且>是此处名称的一部分,因为它们在IL中合法但在C#中不合法;它们与泛型无关)。例如,这将获得一个类中所有自动属性的列表,以及它们的支持字段:t.GetProperties().Where(p=>(p.GetGetMethod()??p.GetSetMethod()).IsDefined(typeof(CompilerGeneratedAttribute),false)).Select(p=>new{Property=p,Field=t.GetField(string.Format("k__BackingField",p.Name),System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance)});没有内置的方法可以做到这一点,因为属性的存在并不一定保证支持字段的存在。我发现这篇文章解释了一种方法。它涉及获取属性设置器的IL并解析它以获取设置字段的证据。安德鲁是对的。实际上,属性只是指向方法的“指针”,通常是VisualStudio或其他高级语言生成的getter/setter(大多数情况下)。但是,解析setter并不容易。而且,由于内部setter只是另一种普通方法,它们可以使用多个字段,或者根本不使用,甚至可以调用其他方法。也许您可以针对常见场景提出解决方案,但您必须解析IL字节码。以上就是C#学习教程:反射:从PropertyInfo获取FieldInfo共享的所有内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
