我正在尝试使用ExpressionVisitor来获取表达式的覆盖成员,但它给了我基本的成员。我在这里想念什么?
以下示例重现了此行为:
简单的基本类型和派生类型:
class Base
{
public virtual string Property { get; set; }
}
class Derived : Base
{
public override string Property { get; set; }
}
我使用这个表达式访问者:
internal class DemoVisitor : ExpressionVisitor
{
private MemberInfo _member;
public static MemberInfo GetMemberInfo(LambdaExpression expression)
{
var visitor = new DemoVisitor();
visitor.Visit(expression);
return visitor._member;
}
protected override Expression VisitMember(MemberExpression node)
{
// invalid member here
//node.Member.DeclaringType.Name.Dump();
_member = _member ?? node.Member;
return base.VisitMember(node);
}
}
这么称呼
void Main()
{
var derived = new Derived();
var expression = (Expression<Func<string>>)(() => derived.Property);
DemoVisitor.GetMemberInfo(expression).DeclaringType.Name.Dump();
}
这将返回Base而不是Derived. 我必须做什么才能找到被覆盖的成员?
我需要它,因为我稍后会读取它的属性,并且它目前正在给我基类而不是派生的属性的属性。