【发布时间】:2010-11-22 10:55:36
【问题描述】:
在 C# 中,当我反映派生类型时,为什么我看不到基类的静态字段?
type.GetFields(BindingFlags.Static) 和 type.GetFields() 我都试过了。
【问题讨论】:
标签: c# reflection inheritance static field
在 C# 中,当我反映派生类型时,为什么我看不到基类的静态字段?
type.GetFields(BindingFlags.Static) 和 type.GetFields() 我都试过了。
【问题讨论】:
标签: c# reflection inheritance static field
这就是它的工作原理。 static 成员实际上是非面向对象的东西。它们不是多态的,它们确实属于它们的声明类型,并且与继承层次结构中的其他类型无关。例如,在访问派生类中的静态成员之前,不需要运行基类的静态初始化程序。
除非指定BindingFlags.FlattenHierarchy,否则不会返回基类的static成员:
type.GetFields(BindingFlags.Static
| BindingFlags.FlattenHierarchy
| BindingFlags.Public)
【讨论】:
BindingFlags.NonPublic 以备不时之需。
BindingFlags.Static 和/或BindingFlags.Instance。
因为它们属于基本类型,并且不被继承。向上移动到该类型,您会找到它们。
-- 编辑
Mehrdad 有正确的答案,但只是为了完整:
foreach(FieldInfo f in b.GetType().GetFields(
BindingFlags.Static
| BindingFlags.FlattenHierarchy
| BindingFlags.Instance
| BindingFlags.Public
)){
Console.WriteLine("found: " + f.Name);
}
【讨论】:
将 BindingFlags.FlattenHierarchy 枚举设置为 Static,这也将搜索静态成员。更多信息: http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx
【讨论】:
你的类型就是你的类型——它不包括基本类型。如果要在基类中搜索字段,则需要使用 BindingFlags.FlattenHierarchy。
您应该看看BindingFlags documentation 来完成您需要的工作。
【讨论】: