首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不访问派生类的重写属性的ExpressionVisitor

不访问派生类的重写属性的ExpressionVisitor
EN

Stack Overflow用户
提问于 2018-10-14 12:51:16
回答 1查看 203关注 0票数 1

我试图使用ExpressionVisitor来获取表达式的重写成员,但它给了我一个基本的成员。我在这里错过了什么?

下面的示例复制此行为:

简单基和派生类型:

代码语言:javascript
复制
class Base
{
    public virtual string Property { get; set; }
}

class Derived : Base
{
    public override string Property { get; set; }
}

我使用这个短语访问者:

代码语言:javascript
复制
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);
    }
}

就这样叫它

代码语言:javascript
复制
void Main()
{
    var derived = new Derived();
    var expression = (Expression<Func<string>>)(() => derived.Property);
    DemoVisitor.GetMemberInfo(expression).DeclaringType.Name.Dump();
}

这将返回Base而不是Derived。我要怎么做才能到达被推翻的成员?

我需要它,因为我稍后将读取它的属性,并且它目前正在给我基类上的属性,而不是派生的属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-14 13:25:06

如果您想知道成员的类/结构的类型,需要查看MemberExpression的表达式属性,它是包含成员的对象(在您的例子中是derived变量)的表达式,并获取其类型。

因此,您的访问者需要同时返回(这里我使用了一个ValueTuple):

代码语言:javascript
复制
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则返回一个MethodInfoPropertyInfoFieldInfo对象,这些对象都是从MemberInfo派生的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52802843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档