2009-08-10 7 views
2

Je construis un arbre d'expression C# pour évaluer des expressions simples. Les chaînes d'expression sont analysées dans les arbres, et respectent les opérateurs de base (mathématique, logique et relationnelle) ainsi que la préséance par l'utilisation de parantheses.Arbres d'expression C# - Recherche de valeur dynamique

En plus des types bool, string et integer, certains éléments de l'expression doivent être évalués lors de l'exécution. Ceux-ci sont représentées par des chaînes templated, par exemple:

([firstname] == "bob") && ([surname] == "builder") 

L'expression ci-dessus serait évaluée pour un (potentiellement important) nombre d'objets qui fournissent le contexte de l'invocation d'expression actuelle, par exemple, dans une boucle. La section modèle serait utilisée de manière réfléchie dans le contexte actuel - par ex. Le prénom et le nom de l'utilisateur actuel seront résolus dans l'exemple et les valeurs utilisées dans la résolution de l'expression plutôt que dans les chaînes de modèles. Une solution consisterait à résoudre la valeur du modèle au moment de l'analyse, de telle sorte qu'un type d'expression constant pourrait être utilisé et le type de la valeur serait connu. Cependant, reconstruire et recompiler l'arbre d'expression à chaque utilisation aurait de mauvaises performances.

, j'ai besoin d'un type d'expression dont: - type de valeur est inconnue au moment de l'analyse, et - qui est résolu par un appel de méthode au moment Invoke

E.g. Desired example of usage in pseudo code 
ExpressionParser parser = new ExpressionParser(); // parses and builds expression trees 
MyParsedExpression expression = parser.Parse("([firstname] == 'bob') && ([surname] == 'builder'"); // wrapper for the parsed expression 
foreach (Object user in users) 
{ 
    expression.Context = user; 
    Boolean result = expression.EvaluateTruth(); 
    if (result == true) 
    { 
     // do something 
    } 
} 

Merci, fturtle

Répondre

2

Utilisez un ParameterExpression pour représenter un paramètre entrant. En ce qui concerne l'exception de type ... connaissez-vous le type de données lorsque vous construisez l'arbre d'expression? Si non, cela rend les choses beaucoup plus difficiles ...

Si cela vous est utile, j'ai répondu récemment à un similar question avec un code source. Il ne peut pas être immédiatement utilisable pour vous, mais cela devrait être un bon début.

EDIT: Je ne suis pas sûr que les arbres d'expression vont vous être très utiles ici. En particulier, un PropertyExpression contient le PropertyInfo correspondant, donc il doit connaître le type avec lequel il travaille. Si le type peut changer pour chaque valeur, vous devrez reconstruire l'arbre d'expression pour chaque valeur ...

+0

Bravo pour la réponse. Je ne suis pas sûr qu'une expression de paramètre va m'aider ici, car les expressions peuvent être imbriquées et peuvent contenir n'importe quel nombre de valeurs basées sur des modèles. De plus, le type n'est pas connu lorsque l'arbre d'expression est construit. En résumé, je suppose que je suis après une sorte d'expression de délégué. – fturtle

+0

Je crains que ce que vous essayez de faire ne soit pas très clair, et quelles informations sont connues à quelle heure. Avez-vous déjà eu le côté analyse des choses? Quelle information * as-tu *, et qu'est-ce que tu n'as pas? Pourriez-vous stocker une forme intermédiaire qui vous permet de construire un arbre d'expression fortement typé plus tard? –