C# 如何在运行时使用反射从类的对象获取属性值
我有一门课,大致如下:C# 如何在运行时使用反射从类的对象获取属性值,c#,reflection,getproperty,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 { pu
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
}
但是,GetProperty()返回null,因为该属性在D或C类中声明
有人能建议我如何做到这一点吗
提前谢谢
GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy)
.GetValue(obj, null);
您正在错误使用绑定标志来指定wheter get instance或static属性:
BindingsFlag.FlattenHierarchy | BindingsFlag.Instance
根据标志BindingsFlag.Instance
或BindingsFlag.Static
必须明确指定才能获取非空值:
必须指定BindingFlags.Instance或BindingFlags.Static
为了得到回报
此外,public
属性在默认情况下被删除。因此,如果属性为public
,则需要指定其他标志:
BindingsFlag.FlattenHierarchy | BindingsFlag.Instance | BindingsFlag.Public
备注:
指定BindingFlags.Public以在
搜索
如果base中的属性是private,flatterhierarchy
将不会枚举它:
继承类中的(…)私有静态成员不包括在内
如果这是您的情况,恐怕您必须手动遍历基类并搜索该属性
还要确保属性名称有效且存在
编辑:
编辑之后,我看到了问题您的类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值等。您能给我们提供一个可复制的示例,并正确拼写方法名称吗?顺便说一句,这应该被问过很多次…………谢谢您的评论,但我尝试了BindingFlag。实例但它不起作用谢谢,但不起作用,请看我添加了一个例子,以便更好地理解这个问题
// 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);