【问题标题】:Backing fields for hidden properties隐藏属性的支持字段
【发布时间】:2013-05-06 07:47:19
【问题描述】:

假设我有以下示例类:

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);

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

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

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

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

【问题讨论】:

    标签: c# reflection properties


    【解决方案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() 的文档说:

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

    这符合我的观察。

    【讨论】:

    • 所以如果我想获得Base中的私有支持字段,我必须遍历Derived类的层次结构?
    • @NickolayRatchev 根据Type.GetFields() 的文档,似乎是这样。另请参阅此答案,这可能有用:stackoverflow.com/questions/9201859/…
    • 这正是我正在寻找的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多