我试图使用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。我要怎么做才能到达被推翻的成员?
我需要它,因为我稍后将读取它的属性,并且它目前正在给我基类上的属性,而不是派生的属性。
发布于 2018-10-14 13:25:06
如果您想知道成员的类/结构的类型,需要查看MemberExpression的表达式属性,它是包含成员的对象(在您的例子中是derived变量)的表达式,并获取其类型。
因此,您的访问者需要同时返回(这里我使用了一个ValueTuple):
internal class DemoVisitor : ExpressionVisitor
{
private Type type;
private MemberInfo _member;
public static (Type, MemberInfo) GetMemberInfo(LambdaExpression expression)
{
var visitor = new DemoVisitor();
visitor.Visit(expression);
return (visitor.type, visitor._member);
}
protected override Expression VisitMember(MemberExpression node)
{
if (_member == null)
{
_member = node.Member;
type = node.Expression.Type;
}
return base.VisitMember(node);
}
}关于访问哪个成员的另一个问题:访问表达式中所有已使用的成员,即所有方法、属性和字段,而node.Member则返回一个MethodInfo、PropertyInfo或FieldInfo对象,这些对象都是从MemberInfo派生的。
https://stackoverflow.com/questions/52802843
复制相似问题