5 Stimmen

Implementieren Sie "Not in"-Ausdrücke in Ausdrucksbäumen, .net 4

Ist es möglich, ein ! (nicht) unter Verwendung von Ausdrucksbäumen umzusetzen? Ich interessiere mich für die Erstellung einer C# Eval-Klasse, die logische Ausdrücke analysiert und auswertet, die true, false, ||, && und ! enthalten. Ich weiß, dass && und || derzeit von .NET 4 Ausdrucksbäumen unterstützt werden, aber ich frage mich, ob es einen Weg gibt, so etwas wie !(x && y) || z zu implementieren, wobei z=false, y=true und z=false sind.

Derzeit verwende ich einen Standard-Stack-basierten Tokenizer, Parser, Auswerter, um diese Arten von Ausdrücken auszuwerten, würde es aber gerne aufgeben, wenn ein geeigneter Ausdrucksbaum erstellt und dynamisch ausgeführt werden könnte.

12voto

Jon Skeet Punkte 1325502

Ich finde normalerweise, dass es sich lohnt, einen Lambda-Ausdruck zu codieren, der das tut, was ich will, und dann zu sehen, was der C#-Compiler damit macht.

Also dieser Code:

Expression> func = x => !x;

Wird kompiliert zu:

ParameterExpression expression2;
Expression> expression = 
       Expression.Lambda>(Expression.Not(
            expression2 = Expression.Parameter(typeof(bool), "x")), 
                new ParameterExpression[] { expression2 });

(Entschuldigung für die Formatierung - es ist schwierig zu wissen, was damit zu tun ist.)

Das ist mit Reflector dekompiliert, aber mit seiner "Optimierung" auf .NET 2.0 eingestellt, um zu verhindern, dass es die Lambda-Syntax verwendet.

Sobald du den Müll überwunden hast, wirst du sehen, dass Expression.Not verwendet wird. && verwendet Expression.AndAlso, und || verwendet Expression.OrElse.

2voto

Travis Gockel Punkte 25964

Dies existiert bereits in System.Linq.Expressions. Siehe UnaryExpression. Es sei denn, es gibt etwas an den Ausdrücken, das Ihnen nicht gefällt, würde ich vorschlagen, sie zu verwenden. Es gibt auch Möglichkeiten, abstrakte Syntaxbäume aus Quellcode zu erstellen, speziell in Microsoft.Scripting.Ast (im DLR gefunden: Microsoft.Scripting).

0voto

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X