Bindeparameter in Ausdrucksbäumen

c# c#-3.0 expression-trees

Frage

Ich würde gerne wissen, wie man Parameter an Werte innerhalb eines Ausdrucksbaums bindet

Etwas wie

Expression<Func<String, String, bool>> e1 = (x,y) => x == y;

Dann möchte ich y binden, während ich es als einen einzelnen Ausdruck behalte. Ein naheliegender Versuch wäre etwas wie

Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here");

Aber das würde meinen Ausdruck in einen Invoke-Knoten verwandeln. Gibt es eine Möglichkeit, einen Parameter innerhalb meines ersten Ausdrucks zu binden, während die Signatur des zweiten Ausdrucks erhalten wird?

Akzeptierte Antwort

Expression<Func<String, String, bool>> e1 = (x,y) => x == y;

var swap = new ExpressionSubstitute(e1.Parameters[1],
    Expression.Constant("Fixed Value Here"));
var lambda = Expression.Lambda<Func<string, bool>>(
    swap.Visit(e1.Body), e1.Parameters[0]);

mit

class ExpressionSubstitute : ExpressionVisitor
{
    public readonly Expression from, to;
    public ExpressionSubstitute(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }
    public override Expression Visit(Expression node)
    {
        if (node == from) return to;
        return base.Visit(node);
    }
}

Dies verwendet ExpressionVisitor zum Neuerstellen des Ausdrucks, wobei y durch die Konstante ersetzt wird.

Ein anderer Ansatz ist die Verwendung von Expression.Invoke , dies funktioniert jedoch nicht in allen Fällen.



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