2009-06-11 5 views

Antwort

0

Ich glaube nicht, dass Sie Ausdruck erweitern können, aber ich denke, Sie könnten einige Ihrer Erweiterungsmethoden hinzufügen, um Ausdrucksbäume zu erstellen, um die Generierung zu vereinfachen.

Zum Beispiel möchten Sie vielleicht immer 2 Strings vergleichen, so dass Sie eine Erweiterungsmethode hinzufügen können, die den Baum zurückgibt, um den Vergleich durchzuführen. Sie können auch einen Ausdruck hinzufügen, der eine Funktion an einer anderen Stelle in Ihrem Code aufruft, sodass Sie nur Ausdrucksbäume für Dinge schreiben können, die unbedingt auf diese Weise entwickelt werden müssen.

1

Dies ist genau das, was der DLR-Code auf Codeplex zu tun hatte; Am Ende haben sie die gesamte Codebasis in a different namespace (IIRC) neu erstellt, bis 4.0 ausgeliefert wird.

Dies funktioniert nicht unbedingt gut mit dem C# -Compiler; Ich habe es ehrlich gesagt nicht versucht.

+0

Dank Marc zurückkehren . Habe ich richtig gedacht, dass der DLR-Code Linq-Ausdrücke als Ausdrucksbibliothek der Wahl ersetzen wird, wenn C# 4.0 ausgeliefert wird? – MalcomTucker

2

Mit .net 3.5 können Sie dies nicht tun, da der Expression-Konstruktor einen ExpressionType-Enumerationswert einnimmt und Sie der Enumeration keine neuen Knotentypen hinzufügen können.

Sie können einen vorhandenen Knotentyp auch nicht überladen, da Sie von keiner der "Blattklassen" (wie BinaryExpression) erben können, da sie alle versiegelt sind.

Entsprechend den MSDN-Dokumenten sieht es so aus, als könnten Sie dies in CLR v4 tun, solange Sie die "Reduce" -Methode überschreiben und einen Knotentyp ExpressionType.Extension verwenden.

0

Ich habe das selbst auch nicht versucht, aber ich stimme der Aussage von Scott zu, dass dies in 4.0 funktionieren sollte.

Insbesondere sagt der Expression Tree Spec on CodePlex dies über die NodeType-Eigenschaft:

Derivations of Expression, die nicht in dem gemeinsamen Satz von Knoten in .NET sind sollten Knoten Art Erweiterung