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类的表达式。有人能为我解释一下这背后的逻辑吗?