Что делает ExpressionVisitor. Посещение <T> Делает?

Прежде чем кто-то выкрикнет ответ, прочитайте вопрос.

Что является целью метода в.NET 4.0's ExpressionVisitor:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)

Мое первое предположение относительно цели этого метода было то, что это посетит каждый узел в каждом дереве, указанном nodes параметр и переписывает дерево с помощью результата elementVisitor функция.

Это, кажется, не имеет место. На самом деле этот метод, кажется, не делает немного больше, чем ничто, если я не пропускаю что-то здесь, которое я сильно подозреваю, что я...

Я пытался использовать этот метод в своем коде и когда вещи не удались как ожидалось, я reflectored метод и найденный:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
{
    T[] list = null;
    int index = 0;
    int count = nodes.Count;
    while (index < count)
    {
        T objA = elementVisitor(nodes[index]);
        if (list != null)
        {
            list[index] = objA;
        }
        else if (!object.ReferenceEquals(objA, nodes[index]))
        {
            list = new T[count];
            for (int i = 0; i < index; i++)
            {
                list[i] = nodes[i];
            }
            list[index] = objA;
        }
        index++;
    }
    if (list == null)
    {
        return nodes;
    }
    return new TrueReadOnlyCollection<T>(list);
}

Таким образом, где кто-то на самом деле пошел бы об использовании этого метода? Что я пропускаю здесь?

Спасибо.

6
задан Shimmy 9 August 2010 в 07:31
поделиться

1 ответ

Мне кажется, что это удобный метод для применения произвольной функции преобразования к дереву выражений и возврата полученного преобразованного дерева или исходного дерева, если нет изменений.

Я не вижу, чем это отличается от стандартного посетителя выражения, кроме того, что кроме использования типа посетителя, здесь используется функция.

Что касается использования:

Expression<Func<int, int, int>> addLambdaExpression= (a, b) => a + b;

// Change add to subtract
Func<Expression, Expression> changeToSubtract = e => 
{ 
    if (e is BinaryExpression) 
    { 
        return Expression.Subtract((e as BinaryExpression).Left,
                                   (e as BinaryExpression).Right); 
    }
    else
    {
        return e;
    }
};  

var nodes = new Expression[] { addLambdaExpression.Body }.ToList().AsReadOnly();
var subtractExpression = ExpressionVisitor.Visit(nodes, changeToSubtract);

Вы не объясняете, как вы ожидали, что он будет себя вести, и почему вы считаете, что он делает не больше, чем ничего.

3
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: