如何使用反射在运行时从类的对象获取属性值

时间:2015-03-02 10:20:02

标签: c# reflection getproperty

我的课程如下:

Class A : B<C>
{
    public A(C entity):base(entity)
    {}
}

abstract class B<T>
{
    public B(T entity)
        {
            Entity = entity;
        }

        public T Entity { get; private set; }
}

Class C: D
{
    public string prop2{get;set;}
}
Class D
{
    public string prop1{get;set;}
}
 Main()
 {
 A obj = new A(new C());
 obj.GetType().GetProperty("prop1",  BindingsFlag.Instance|BindingsFlag.FlatteredHierarchy)//  is null


 }

我有A级的对象。 我想在运行时从这个对象获取属性值。

我正在尝试

obj.GetType().GetProprty("propertyName", 
                         BindingsFlag.FlattenHierarchy).GetValue(obj, null);

然而,GetProprty()正在撤销null,因为该属性是在D或C类中声明的。

有人可以建议我如何实现这个目标吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy)
         .GetValue(obj, null);

您正在编写指定wheter get实例或静态属性的绑定标志:

 BindingsFlag.FlattenHierarchy | BindingsFlag.Instance

根据MSDN标记BindingsFlag.InstanceBindingsFlag.Static必须明确指定才能获得非空值:

  

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

此外,默认情况下会public属性被排除。因此,如果您的属性为public,则需要指定其他标记:

BindingsFlag.FlattenHierarchy | BindingsFlag.Instance | BindingsFlag.Public

说明:

  

指定BindingFlags.Public以包含公共属性   搜索范围。

如果base中的属性是私有的,FlattenHierarchy将不会枚举它:

  

(...)不包括继承类中的私有静态成员   如果这是你的情况,我担心你必须手动通过基类并搜索该属性。

确保该属性名称有效且存在。

修改 编辑后,我看到了问题。 你的A类不是D类的子类(你想从D类获得属性)。这就是为什么获取属性值不能以这种方式工作的原因。 您需要按照以下步骤操作:

// get entity prop value
var entityValue =
    (obj.GetType()
        .GetProperty("Entity", 
           BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public)
        .GetValue(obj));
// get prop value
var prop1Value =
    entityValue.GetType()
               .GetProperty("prop1", 
                  BindingFlags.FlattenHierarchy | 
                  BindingFlags.Instance | 
                  BindingFlags.Public)
               .GetValue(entityValue);

请记住处理 null 值等。