Peu curieux de comprendre Expression Tree dans .NET

c# expression expression-trees

Question

J'ai lu plusieurs articles et plusieurs messages de stackoverflow.com sur l'arbre d'expression. Il bat mon cerveau pour comprendre.

Des questions:

1) Comme DOM (Document Object Model), c’est une représentation de la logique en mémoire?

2) Quelqu'un a expliqué qu'il s'agissait d'un mécanisme permettant de traduire un code exécutable en données. En l'utilisant, nous pouvons produire une structure de données représentant le code.

Est-ce que cela signifie que les arbres d'expression sont utilisés pour concevoir un modèle défini par l'utilisateur?

3) La plupart des exemples montrent l'arbre d'expression en conjonction avec un délégué Func<> ou d'autres délégués. L'utilisation de délégué et d'une autre structure de programmation ne permet donc pas d'obtenir le même résultat que les services d'arborescence d'expression.

L'explication compréhensible pour les débutants est hautement appréciée.

Réponse acceptée

L'arbre d'expression représente un arbre de syntaxe d'une seule expression.

Chaque nœud de l’arbre représente une constante, une référence à un membre d’objet ou une opération.

Par exemple, pour l'expression 2 + 3 nous pouvons construire un arbre d'expression:

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

Le plus important de ces arbres est Expression, qui permet d’écrire une expression sous une forme lisible rappelant aux fonctions lambda la correspondance de signature TDelegate. Voici ex

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

Mais Expression n’est pas déléguée, car elle ne peut pas être exécutée directement.

Au lieu de cela, il peut être parcouru, par exemple avec un objet visiteur, pour créer une représentation exécutable. Des exemples peuvent être la construction déléguée avec Expression.Compile () ou la requête SQL construite à partir d'une requête LINQ utilisant CompiledQuery.Compile (), etc.

Une autre application utile des arbres d'expression consiste à les utiliser pour représenter des membres d'objets qui, autrement, nécessiteraient l'utilisation de Reflection. Reflection utilise des chaînes pour représenter les noms des membres et n'effectue aucune vérification au moment de la compilation. Les arbres d’expression sont vérifiés, ce qui réduit un peu le nombre d’erreurs.

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

Réponse d'expert

Expression est un moyen polyvalent d'exprimer des opérations de code sous la forme d'un modèle objet. Ceci est beaucoup plus étendu dans la version 4.0, mais c’est un domaine que j’utilise beaucoup ; J'ai quelques points de blog ici , ou une autre tentative d'expliquer tout cela sur InfoQ . J'ai également présenté ce sujet à quelques reprises - essayez peut-être le téléchargement ici (mais cela n'aurait pas beaucoup de sens sans les mots; désolé).

Je serai honnête; ce n'est pas un sujet simple, mais il est extrêmement puissant quand vous le prenez. De ce qui précède, je commencerais probablement par l’InfoQ.




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