Bit Neugierig, Expression Tree in .NET zu verstehen

c# expression expression-trees

Frage

Ich habe mehrere Artikel und mehrere stackoverflow.com Posts über Ausdrucksbaum gelesen. Es schlägt mein Gehirn, um zu verstehen.

Fragen:

1) Wie DOM (Document Object Model) ist es eine In-Memory-Darstellung der Logik?

2) Jemand hat erklärt, dass es ein Mechanismus ist, um einen ausführbaren Code in Daten zu übersetzen, mit dem wir eine Datenstruktur erzeugen können, die den Code darstellt.

Bedeutet es, dass Expression-Bäume verwendet werden, um ein benutzerdefiniertes Muster zu entwerfen?

3) Die meisten Beispiele zeigen den Ausdrucksbaum in Verbindung mit dem Delegierten Func<> oder anderen Delegaten. Durch die Verwendung von Delegaten und anderen Programmierkonstrukten können wir nicht dasselbe erreichen, wie der Ausdruck Baum dient.

Anfänger verständliche Erklärung wird sehr geschätzt.

Akzeptierte Antwort

Der Ausdrucksbaum repräsentiert einen Syntaxbaum eines einzelnen Ausdrucks.

Jeder Knoten des Baums repräsentiert eine Konstante, Objektmemberreferenz oder Operation.

ZB für Ausdruck 2 + 3 wir einen Baum erstellen und einen Ausdruck erstellen:

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

Der wichtigste dieser Bäume ist der Ausdruck, der es ermöglicht, Ausdrücke in gut lesbarer Form zu schreiben, die an Lambda-Funktionen des Signaturvergleichs TDelegate erinnern. Hier ist Ex

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

Aber Expression ist kein Delegat, da er nicht direkt ausgeführt werden konnte.

Stattdessen kann es zB mit Besucherobjekt durchlaufen werden, um eine ausführbare Darstellung zu erstellen. Beispiele könnten der Delegate-Build mit der Expression.Compile () - oder SQL-Abfrage sein, die aus der LINQ-Abfrage mit CompiledQuery.Compile () usw. erstellt wurde.

Eine weitere nützliche Anwendung von Ausdrucksbäumen ist die Verwendung von ihnen, um Elemente von Objekten darzustellen, die andernfalls die Verwendung von Reflektion erfordern würden. Reflection verwendet Zeichenfolgen, um Elementnamen darzustellen, und führt keine Prüfungen zur Kompilierungszeit durch. Ausdrucksbäume werden überprüft, so dass etwas weniger Fehler gemacht werden können.

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

Expertenantwort

Expression ist eine vielseitige Möglichkeit, Codeoperationen als Objektmodell auszudrücken. Dies wird verlängert viel mehr in 4.0, aber dies ist ein Bereich , den ich benutze eine Menge; Ich habe ein paar Blog - Punkte hier , oder einen anderen Versuch, alles auf die Erläuterung InfoQ . Ich habe dieses Thema auch ein paar Mal vorgestellt - vielleicht probier den Download hier aus (aber es macht nicht so viel Sinn ohne die Worte; sorry).

Ich werde ehrlich sein; Es ist kein einfaches Thema - aber es ist sehr mächtig, wenn Sie es knacken. Von oben würde ich wahrscheinlich mit dem InfoQ beginnen.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum