支持隐藏属性的字段

时间:2013-05-11 22:35:17

标签: c# reflection properties

假设我有以下示例类:

public class Base
{
    public int Value { get; set; }
}

public class Derived : Base
{
    public new string Value { get; set; }

    public bool IsBaseValueSet()
    {
        return base.Value != 0;
    }

    public void SetBaseValue(int value)
    {
        base.Value = value;
    }
}

属性Value隐藏在Derived中,并替换为string类型的属性。现在如果:

var properties = typeof(Derived).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

我将只获得一个属性,即类Value中的Derived。此外,如果我检查类字段:

var fields = typeof(Derived).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

我仍然只会得到一个支持字段,这是Derived类中的一个。为什么会这样? Derived类仍然可以访问base.Value,具有逻辑,等等,但它的值似乎在类中缺失。有没有办法通过反射访问它?在通过Derived类型反映时,此值不会显示的原因是什么? (注意:我意识到我可以通过Base反映并获得价值,但我问我们为什么在我们反映Derived时没有显示出这个值,即使它显然存在并且可以被操纵)。

编辑:如果两个Value成员都被声明为字段而不是属性,则行为是“正常”,反射将同时获得它们。

1 个答案:

答案 0 :(得分:1)

我没有得到相同的结果(或者我误解了你的意思)。

如果我编写此代码(使用您的BaseDerived类):

var properties = typeof(Derived).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

foreach (var propertyInfo in properties)
    Console.WriteLine("Property Name: {0}, Type: {1}", propertyInfo.Name, propertyInfo.PropertyType.FullName);

我得到了这个输出:

Property Name: TestValue, Type: System.String
Property Name: TestValue, Type: System.Int32

所以我看到两个属性都使用反射,而不只是一个。

但是,在反映字段时,我只获取派生类中的字段。

Type.GetFields()的文档说:

  

仅返回基类上的受保护和内部字段;不返回基类上的私有字段。

符合我的观察。