2

我有一个类似下面的课程:

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 类中声明的。

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

提前致谢。

4

1 回答 1

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

您缺少指定获取实例还是静态属性的绑定标志:

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

请记住处理值等。

于 2015-03-02T10:22:18.503 回答