Что делает ExpressionVisitor.Visit <T>? - PullRequest
6 голосов
/ 05 июля 2010

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

Какова цель метода в ExpressionVisitor .NET 4.0:

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

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

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

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

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);
}

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

Спасибо.

1 Ответ

3 голосов
/ 05 июля 2010

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

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

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

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...