为什么子级重写属性的 MemberExpression 显示父级属性

sil*_*der 5 .net c# reflection attributes linq-expressions

假设我们有 2 个班级

class A{
   public abstract int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这是孩子

class Child : A{
   [CustomAttr(someval)] 
   override public int Prop1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

所以稍后在我的代码中我需要获取此自定义属性的 val。

bool haveCustomAttr(IExpression<Func<Child, int>> property){
    return ((MemberExpression)property.Body).Member.GetCustomAttributes(typeof(CustomAttr)).Any();
}
Run Code Online (Sandbox Code Playgroud)

所以当我调用这段代码时

haveCustomAttr(c => c.Prop1)
Run Code Online (Sandbox Code Playgroud)

它的返回是false因为((MemberExpression)property.Body).Member它是出于某种原因A.Prop1而不是Child.Prop1

可以用这样更先进的结构来修复

((MemberExpression)property.Body).Expression.Type.GetMember(((MemberExpression)property.Body).Member
                .Name)[0].GetCustomAttributes(typeof(CustomAttr), false).Any(); 
Run Code Online (Sandbox Code Playgroud)

但我仍然不清楚为什么它最初会威胁这个表达式作为基类,如果它明确地说它是来自Child类的表达式。有人能为我解释一下这背后的逻辑吗?