如何使用反射获取继承属性的值?

时间:2012-09-08 11:18:21

标签: c# reflection

如何使用反射获取继承的属性值? 我尝试使用BindingFlags,但仍触发NullReferenceException

object val = targetObject.GetType().GetProperty("position", BindingFlags.FlattenHierarchy).GetValue(targetObject, null);

position是iherited公共财产,具有声明的价值。

修改

class myParent
{
    public float[] position;
    public myParent()
    {
        this.position = new float[] { 1, 2, 3 };
    }
}

class myChild : myParent
{
    public myChild() : base() { }
}

myChild obj = new myChild();
PropertyInfo p = obj.GetType().GetProperty("position", BindingFlags.Instance | BindingFlags.Public); 

我尝试了几种与BindingFlags的组合,但p总是为空:(,

2 个答案:

答案 0 :(得分:13)

如果您使用BindingFlags重载,则必须明确指定您感兴趣的所有标志。

另请注意:(来自MSDN

  

您必须指定BindingFlags.Instance或BindingFlags.Static   为了获得回报。

object val = targetObject.GetType()
             .GetProperty("position", 
                          BindingFlags.FlattenHierarchy | 
                          BindingFlags.Instance | 
                          BindingFlags.Public)
             .GetValue(targetObject, null);

编辑:

您有position 字段而非属性

(开始学习差异的好地方:Difference between Property and Field in C# 3.0+尤其是这个answer

将您的position更改为媒体资源:

public float[] position { get; set; }

或者您使用targetObject.GetType().GetField(...方法检索字段。

答案 1 :(得分:1)

BindingFlags.FlattenHierarchy

仅适用于静态成员。请务必指定

BindingFlags.Instance | BindingFlags.Public

你应该得到继承的属性。