【问题标题】:Different ways to parse / visit Expressions when traversing遍历时解析/访问表达式的不同方式
【发布时间】:2011-09-01 20:13:24
【问题描述】:

我有一个关于解析表达式树的基本问题。

使用 if 语句来确定表达式的 NodeType 并相应地处理它与分派表达式执行不同的访问者方法之间有区别吗?

这也是正确的调度方式:

    protected override Expression VisitMember(MemberExpression m)
    {
        if (m.Expression.NodeType == ExpressionType.Constant)
        {
             Expression e = (m.Expression as ConstantExpression); 

             this.Visit(e); // dispatches to VisitConstant() ?
        }

    }

对比:

    protected override Expression VisitMember(MemberExpression m)
    {
        if (m.Expression.NodeType == ExpressionType.Constant)
        {
             //specific code to handle constant
        }
    }

顺便说一下,这是指解析以下内容:

dbContext.Products.Where(x => x.ID == user.ProductID).AsEnumerable()
// user.FooID is 'MemberExpression' 

NodeType 和简单的表达式类型之间究竟是什么关系?例如,我注意到有些 NodeTypes 似乎没有可覆盖的访问者方法,对吗?

【问题讨论】:

  • 第一个版本可能是正确的(取决于访问者的其余部分),但不需要演员表。

标签: c# .net linq expression expression-trees


【解决方案1】:

一些表达式类型,例如MemberInit,在类和关联的ExpressionType枚举值之间具有一一对应关系,而对于其他表达式类型,该类更通用并且与多个ExpressionType相关,例如与BinaryExpression(可以是AddDivide 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2015-09-11
    • 2021-03-14
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多