2010-07-17 7 views

Antwort

25

Ausdruck Bäume haben viel gemeinsam mit (zum Beispiel) AST. Es wird nicht direkt dem Code zugeordnet, ist aber sehr gut für die Erstellung von Algorithmen geeignet. Zum Beispiel, wenn Sie eine Formel parsen:

((a + 2)/b) 

das ist:

ParameterExpression a = ..., b = ... 
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)), 
    b); 
var lambda = Expression.Lambda(body,a,b); // optionally with generics 

In der Tat, ich genau dies getan habe, mit einem Parser, der einen Objektbaum bauen, mit Objekten zu erzeugen der vollständige Ausdruck über eine "Besucher" -Implementierung. In .NET 4.0 ermöglicht die umfassendere Unterstützung für den Ausdrucksbaum die Unterstützung der meisten Szenarien und deren bedarfsgerechte Kompilierung. Eine weitere wichtige Verwendung von Ausdrücken

ist, dass man dekonstruieren zur Laufzeit, so in Ihrem Code Sie haben könnten:

Foo(x => x.SomeMethod(1, "abc")); 

und extrahieren Sie die SomeMethod Methode-Info, 1 und "abc" usw.


CodeDOM Karten zu Code. Es geht um Aussagen usw., sehr ähnlich, wie Sie normalen Code schreiben würden. Die gebräuchlichste Verwendung von codedom ist die Codegenerierung als Teil von Werkzeugen. Sie können verwenden Sie es für die dynamische Zusammenstellung, aber um ehrlich zu sein ist es schwieriger. Ich bin kein Fan. Das nette Feature ist, dass ein codedom Baum für mehrere Sprachen arbeiten kann.


hier Ein weiterer Anwärter sollte DynamicMethod und/oder ILGenerator sein. Diese nicht Zuordnung zu einem AST (Ausdruck), und kann nicht verwendet werden, um Quellcode (codedom) zu generieren, sondern ermöglicht den vollen Zugriff auf die MSIL-Tools. Natürlich erfordert es auch, dass Sie in Bezug auf Stacks usw. denken, aber es ist sehr effizient und effektiv für Meta-Programmierung.


Wenn ILGenerator ist zu hart-Kern und CodeDOM ist ein PITA, dann eine andere Option ist Runtime Generierung von Code als String. Dann geben Sie das durch CSharpCodeProvider, um es zu kompilieren. Es gibt Teile der Kernlaufzeit, die dies tun (XmlSerializer IIRC).


Um es zusammenzufassen:

  • Meta-Programmierung: ILGenerator oder CSharpCodeProvider; auch Expression in 4,0 (aber das ist ganz in 3,5 begrenzt)
  • Handhabung AST: Expression
  • Parsen zur Laufzeit: Expression
  • Codegenerierung in mehreren Sprachen: Code-dom
0

Ausdrucksbäume werden zum Erstellen von Ausdrücken verwendet. Quellcode zur Laufzeit erstellen CodeDom wird zum Kompilieren von Quellcode verwendet. Es muss existieren, bevor Sie es bauen können. Ausdrucksbäume sind flexibler, aber viel schwieriger zu verwenden.

Wenn Sie Scripting zu Ihrer Anwendung hinzufügen möchten, verwenden Sie CodeDom. Wenn Sie sehr fortgeschrittene Reflexionen und dergleichen durchführen möchten, verwenden Sie Ausdrucksbäume, aber ich empfehle es nicht.