繁体   English   中英

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

[英]How to get value of property from object of class at runtime using reflection

我有一个类如下:

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

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

提前致谢。

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

您正在错误地指定wheter get实例或静态属性的绑定标志:

 BindingsFlag.FlattenHierarchy | BindingsFlag.Instance

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

您必须指定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);

记得处理值等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM