Различные способы анализа / посещения выражений при обходе - PullRequest
1 голос
/ 02 сентября 2011

У меня есть основной вопрос о разборе деревьев выражений.

Есть ли разница между использованием операторов 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() ?
        }

    }

Versus:

    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 Ответ

1 голос
/ 02 сентября 2011

Некоторые типы выражений, такие как MemberInit, имеют взаимно-однозначное соответствие между классом и соответствующим перечисляемым значением ExpressionType, в то время как с другими класс является более общим и относится к более чем одному ExpressionType, например с BinaryExpression (может быть Add, Divide и т. д.).

...