我的课程如下:
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类中声明的。
有人可以建议我如何实现这个目标吗?
提前致谢。
答案 0 :(得分:3)
GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy)
.GetValue(obj, null);
您正在编写指定wheter get实例或静态属性的绑定标志:
BindingsFlag.FlattenHierarchy | BindingsFlag.Instance
根据MSDN标记BindingsFlag.Instance
或BindingsFlag.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 值等。