C#反射基类麻烦

时间:2010-10-06 15:57:12

标签: c# .net reflection

我希望通过字段名称获得基类字段的值,在子类中:

class A
{
    protected static double? x;
}

class B : A
{
     B()
       : base()
     {
         x = 13F;       
     }

    void test()
    {
         double? s = this.GetType().
           GetField("x", BindingFlags.NonPublic  | BindingFlags.Static).GetValue(null) as double?;
    }
}

为什么我有TargetException,当我调用test()方法?

2 个答案:

答案 0 :(得分:2)

double? s = GetType()
            .GetField("x", BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Static)
            .GetValue(null) as double?;

来自System.Reflection.BindingFlags

  

FlattenHierarchy:指定它   公共和受保护的静态成员   应该返回层次结构。   继承的私有静态成员   不返回类。静态的   成员包括领域,方法,   事件和属性。嵌套类型   不归还。

我认为这只是一个测试反映基类型中静态成员的玩具示例?否则,在此上下文中使用反射似乎有点奇怪:protected成员对子类是可见的。你可以这么做:

double? s = x;

答案 1 :(得分:1)

添加BindingFlags.FlattenHierarchy

       GetField("x", BindingFlags.NonPublic  | BindingFlags.Static | BindingFlags.FlattenHierarchy).GetValue(null) as double?;