遍历时解析/访问表达式的不同方法

时间:2011-09-01 20:13:25

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

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

使用if语句来确定表达式的NodeType并相应地处理它,与调度表达式执行不同的Visitor方法之间有区别吗?

这也是正确的发送方式:

    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似乎没有可覆盖的访问者方法,这是正确的吗?

1 个答案:

答案 0 :(得分:1)

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