Was bedeutet ExpressionVisitor.Visit? <T> Machen?

c#-4.0 expression-trees expressionvisitor linq

Frage

Bevor jemand die Antwort schreit, lesen Sie bitte die Frage durch.

Was ist der Zweck der Methode in .NET 4.0 ExpressionVisitor:

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

Meine erste Vermutung elementVisitor des Zwecks dieser Methode war, dass sie jeden Knoten in jedem Baum, der durch den nodes spezifiziert wurde, besucht und den Baum mit dem Ergebnis der elementVisitor Funktion neu elementVisitor .

Dies scheint nicht der Fall zu sein. Eigentlich scheint diese Methode ein wenig mehr als nichts zu tun, es sei denn, ich verpasse hier etwas, was ich stark verdächtige ...

Ich habe versucht, diese Methode in meinem Code zu verwenden, und als die Dinge nicht wie erwartet funktionierten, überlegte ich die Methode und fand:

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

Wo würde jemand diese Methode anwenden? Was fehlt mir hier?

Vielen Dank.

Akzeptierte Antwort

Es sieht für mich wie eine bequeme Methode aus, um eine Arbitrary-Transformationsfunktion auf einen Ausdrucksbaum anzuwenden und den resultierenden transformierten Baum oder den ursprünglichen Baum zurückzugeben, wenn es keine Änderung gibt.

Ich kann nicht sehen, dass dies ein anderes Muster als ein Standard-Ausdruck-Besucher ist. Außer der Verwendung eines Besuchertyps verwendet es eine Funktion.

Wie für die Verwendung:

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

Du erklärst nicht, wie du es erwartet hast und warum du denkst, dass es wenig mehr als nichts tut.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum