Changer le corps de délégué d'expression lors de l'exécution?

.net .net-4.0 c# expression-trees

Question

J'ai ce code qui produit un délégué qui multiplie mon nombre par 5

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numMultiply = Expression.Multiply(numParam,five);

Permet de créer le délégué:

Expression<Func<int, int>> lambda1 =
    Expression.Lambda<Func<int, int>>(
        numMultiply,
        new ParameterExpression[] { numParam });
Console.Write(lambda1.Compile()(4));

Maintenant, disons que je veux changer cet arbre d'expression pour Add au lieu de Multiply
voici la nouvelle ligne:

BinaryExpression numAdd = Expression.Add(numParam,five);

Mais comment puis-je changer le lambda1 pour qu'il utilise maintenant numAdd au lieu de multiply ?

Réponse acceptée

Vous venez de construire un nouveau et de le compiler.

Expression<Func<int, int>> lambda1 =
     Expression.Lambda<Func<int, int>>(
         numAdd,
         new ParameterExpression[] { numParam });

De la page MSDN :

Les arbres d'expression doivent être immuables. Cela signifie que si vous souhaitez modifier une arborescence d'expression, vous devez créer une nouvelle arborescence d'expression en copiant celle existante et en y remplaçant les nœuds. Vous pouvez utiliser un visiteur de l'arborescence des expressions pour parcourir l'arborescence des expressions existante.

La phrase "devrait être" est un peu étrange mais lorsque vous regardez l'API, vous verrez que toutes les propriétés pertinentes (Corps, Gauche, Droite) sont en lecture seule.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi