为什么对孩子的被覆盖属性的MemberExpression显示父母的属性

时间:2018-02-16 15:23:29

标签: c# .net reflection attributes linq-expressions

假设我们有两个班级

class A{
   public abstract int Prop1 {get; set;}
}

和它的孩子

class Child : A{
   [CustomAttr(someval)] 
   override public int Prop1 {get; set;}
}

所以稍后在我的代码中我需要获得这个自定义属性' s。

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

所以当我调用此代码时

haveCustomAttr(c => c.Prop1)

它返回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(); 

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

0 个答案:

没有答案