c# - 为什么 Type.GetFields() 不返回基类中的支持字段?

标签 c# reflection properties backing-field

在 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/

相关文章:

c# - 为什么 GetCustomAttributes 返回 object[] 而不是 Attribute[]?

tomcat - tomcat应用程序之间的反射

javascript - JavaScript 的属性访问表达式

ios - 无法从 Objective-C View Controller 访问 Swift var - iOS

c# - PropertyInfo.GetProperty 在不应返回 null 时返回

c# - 绑定(bind)列字段和模板列字段的区别

c# - 使用 LINQ 解析 XDocument

c# - Entity Framework AddObject 只有 "INSERT INTO"某些列

c# - 如何从 Selenium Driver.PageSource 获取 HtmlAgilityPack.HtmlDocument?

.net - ASP.NET MVC Web 应用程序中忽略了 AssemblyInfo 版本控制?