[英]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.Instance
或BindingsFlag.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.