在 C# 中,如果您将 Type.GetFields()
与表示派生类的类型一起使用,它将返回 a) 派生类中所有显式声明的字段,b) 自动的所有支持字段派生类中的属性和 c) 基类中所有显式声明的字段。
为什么缺少基类中自动属性的 d) 支持字段?
例子:
public class Base {
public int Foo { get; set; }
}
public class Derived : Base {
public int Bar { get; set; }
}
class Program {
static void Main(string[] args) {
FieldInfo[] fieldInfos = typeof(Derived).GetFields(
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.FlattenHierarchy
);
foreach(FieldInfo fieldInfo in fieldInfos) {
Console.WriteLine(fieldInfo.Name);
}
}
}
这将只显示 Bar 的支持字段,而不是 Foo。
最佳答案
作为背景字段的字段对反射没有影响。支持字段的唯一相关属性是它们是私有(private)的。
即使您使用 FlattenHierarchy
,反射函数也不会返回基类的 private 成员。您将需要手动遍历您的类层次结构并在每个类层次结构上请求私有(private)字段。
我认为编写 FlattenHierarchy
的目的是向您查看的类中的代码显示所有可见的成员。因此基成员可以被更派生类中具有相同名称的成员隐藏/隐藏,私有(private)成员根本不可见。
关于c# - 为什么 Type.GetFields() 不返回基类中的支持字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201859/