假设我有以下示例类:
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
成员都被声明为字段而不是属性,则行为是“正常”,反射将同时获得它们。
答案 0 :(得分:1)
我没有得到相同的结果(或者我误解了你的意思)。
如果我编写此代码(使用您的Base
和Derived
类):
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()
的文档说:
仅返回基类上的受保护和内部字段;不返回基类上的私有字段。
符合我的观察。