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