【问题标题】:C# Reflection - Base class static fields in Derived typeC# 反射 - 派生类型中的基类静态字段
【发布时间】:2010-11-22 10:55:36
【问题描述】:

在 C# 中,当我反映派生类型时,为什么我看不到基类的静态字段?

type.GetFields(BindingFlags.Static)type.GetFields() 我都试过了。

【问题讨论】:

    标签: c# reflection inheritance static field


    【解决方案1】:

    这就是它的工作原理。 static 成员实际上是非面向对象的东西。它们不是多态的,它们确实属于它们的声明类型,并且与继承层次结构中的其他类型无关。例如,在访问派生类中的静态成员之前,不需要运行基类的静态初始化程序。

    除非指定BindingFlags.FlattenHierarchy,否则不会返回基类的static成员:

    type.GetFields(BindingFlags.Static 
                 | BindingFlags.FlattenHierarchy
                 | BindingFlags.Public)
    

    【讨论】:

    • 应该注意,这仍然不会在基类上找到 private 静态。以防万一这就是 OP 正在尝试做的事情。
    • 是的,这只是一个例子。只需添加BindingFlags.NonPublic 以备不时之需。
    • 实际上还是不行。您必须直接在基类上反映私有静态字段。虽然我希望 OP 不会尝试这样做 ;)
    • 快速提问。我尝试了 BindingFlags.FlattenHierarchy 的东西来查找方法,在这种情况下它什么也不返回。为什么会这样?
    • 您需要指定BindingFlags.Static 和/或BindingFlags.Instance
    【解决方案2】:

    因为它们属于基本类型,并且不被继承。向上移动到该类型,您会找到它们。

    -- 编辑

    Mehrdad 有正确的答案,但只是为了完整:

    foreach(FieldInfo f in b.GetType().GetFields(
        BindingFlags.Static
        | BindingFlags.FlattenHierarchy
        | BindingFlags.Instance
        | BindingFlags.Public
        )){
        Console.WriteLine("found: " + f.Name);
    }
    

    【讨论】:

      【解决方案3】:

      将 BindingFlags.FlattenHierarchy 枚举设置为 Static,这也将搜索静态成员。更多信息: http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx

      【讨论】:

        【解决方案4】:

        你的类型就是你的类型——它不包括基本类型。如果要在基类中搜索字段,则需要使用 BindingFlags.FlattenHierarchy

        您应该看看BindingFlags documentation 来完成您需要的工作。

        【讨论】:

          猜你喜欢
          • 2011-08-16
          • 1970-01-01
          • 2021-11-10
          • 2014-04-27
          • 2018-01-07
          • 2010-09-22
          • 1970-01-01
          • 2011-03-05
          • 2012-03-26
          相关资源
          最近更新 更多