C # 4 "dynamique" dans les arbres d'expression

c# c#-4.0 dynamic expression-trees

Question

J'essaie de comprendre comment assembler toutes les pièces et souhaiterais un exemple concret de code source pour un cas simple.

Considérez le code C # suivant:

Func<int, int, int> f = (x, y) => x + y;

Je peux produire une fonction équivalente au moment de l'exécution en utilisant des arbres d'expression comme suit:

Func<int, int, int> f = (x, y) => x + y;

Maintenant, étant donné le lambda suivant:

Func<int, int, int> f = (x, y) => x + y;

Comment pourrais-je générer l'équivalent en utilisant des arbres d'expression (et probablement Expression.Dynamic )?

Réponse acceptée

Vous pouvez créer une arborescence d'expression qui représente une expression d'addition dynamique C # en transmettant CallSiteBinder pour une expression d'addition dynamique C # à Expression.Dynamic. Vous pouvez découvrir le code pour créer le classeur en exécutant Reflector sur l'expression dynamique d'origine. Votre exemple ressemblerait à ceci:

var x = Expression.Parameter(typeof(object), "x");
var y = Expression.Parameter(typeof(object), "y");
var binder = Binder.BinaryOperation(
    CSharpBinderFlags.None, ExpressionType.Add, typeof(Program),
    new CSharpArgumentInfo[] { 
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), 
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)});
Func<dynamic, dynamic, dynamic> f =
    Expression.Lambda<Func<object, object, object>>(
        Expression.Dynamic(binder, typeof(object), x, y),
        new[] { x, y }
    ).Compile();

Réponse populaire

Vous ne pouvez pas le faire car un arbre d'expression "ne peut pas contenir d'opération dynamique".

Ce qui suit ne sera pas compilé, à cause de l'opération +, par exemple, et que vous essayez de créer un arbre d'expression qui ne respecte pas cette règle:

 Expression<Func<dynamic, dynamic, dynamic>> f = (x, y) => x + y;

Si vous n'étiez pas en train d'ajouter une opération, vous pourriez vous en tirer.

Voir Comment créer une expression <Func <dynamic, dynamic >> - Ou s'agit-il d'un bogue? pour plus d'informations.

Modifier:

Ceci est aussi proche que possible, en définissant ma propre méthode Add qui prend des paramètres dynamiques et renvoie un résultat dynamique.

 Expression<Func<dynamic, dynamic, dynamic>> f = (x, y) => x + y;



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