0

假设我有以下示例类:

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并替换为 type 的属性string。现在如果这样做:

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

我将只获得一个属性,即Valuein the class Derived。此外,如果我检查类字段:

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

我仍然只会得到一个支持领域,那就是Derived班级里的那个。为什么呢?该类Derived仍然可以访问base.Value,对其具有逻辑等,但该类似乎缺少它的值。有没有办法通过反射来访问它?Derived通过类型反映时这个值没有出现的原因是什么?(注意:我意识到我可以反思Base并获得价值,但我想问为什么当我们反思时该价值没有出现,Derived即使它明显存在并且可以被操纵)。

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

4

1 回答 1

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()说:

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

这符合我的观察。

于 2013-05-11T22:51:08.250 回答