Paramètre de liaison dans les arbres d'expression

c# c#-3.0 expression-trees

Question

J'aimerais savoir comment lier des paramètres à des valeurs dans un arbre d'expression

Quelque chose comme

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

Ensuite, j'aimerais lier y, tout en le conservant comme une expression unique. Une tentative évidente serait quelque chose comme

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

Mais cela transformerait mon expression en un nœud Invoke. Existe-t-il un moyen de lier simplement un paramètre dans ma première expression tout en obtenant la signature de la deuxième expression?

Réponse acceptée

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

avec

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

ceci utilise ExpressionVisitor pour reconstruire l'expression, en substituant y avec la constante.

Une autre approche consiste à utiliser Expression.Invoke , mais cela ne fonctionne pas dans tous les cas.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow