9

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

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

position是继承的公共财产并具有声明的价值。

编辑:

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始终为 null :( ,

4

2 回答 2

17

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

另请注意:(来自MSDN

您必须指定 BindingFlags.Instance 或 BindingFlags.Static 才能获得回报。

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

编辑:

你有一个position 字段而不是一个属性

(一个开始学习差异的好地方:C# 3.0+ 中的属性和字段之间的差异,尤其是这个答案

将您的更改position为属性:

public float[] position { get; set; }

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

于 2012-09-08T11:22:05.087 回答
3
BindingFlags.FlattenHierarchy

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

BindingFlags.Instance | BindingFlags.Public

你应该得到继承的属性。

于 2012-09-08T11:24:38.653 回答