2012-04-10 18 views
2

Was macht Expression<T>?Was ist Ausdruck <T> tun?

Ich habe es gesehen, in einem Verfahren ähnlich wie:

private Expression<Func<MyClass,bool>> GetFilter(...) 
{ 
} 

Kannst du nicht einfach die Func<MyClass,bool> zurückkehren?

Google und SO-Suchen haben mich aufgrund der <und> Zeichen fehlgeschlagen.

+0

Suche nach 'Expression Trees' vs' Anonymous Delegates'. – Oded

+0

So wird Ausdruck als Ausdrucksbaum bezeichnet? – Khan

+1

Es wird verwendet, um Ausdrucksbäume zu erstellen. – Oded

Antwort

4

Wenn TDelegate einen Typ Delegierten repräsentiert, dann Expression<TDelegate> stellt einen Lambda-Ausdruck, der einen Delegaten vom Typ TDelegate als umgerechnet werden können Ausdrucksbaum. Dadurch können Sie einen Lambda-Ausdruck programmatisch untersuchen, um nützliche Informationen zu extrahieren.

Zum Beispiel, wenn Sie

var query = source.Where(x => x.Name == "Alan Turing"); 

dann kann x => x.Name == "Alan Turning" programmatisch inspiziert werden, wenn sie als Ausdruck Baum dargestellt wird, aber nicht so viel, wenn es als Delegierter gedacht ist. Dies ist besonders nützlich im Falle von LINQ-Anbietern, die den Ausdrucksbaum laufen lassen, um den Lambda-Ausdruck in eine andere Darstellung zu konvertieren. Zum Beispiel, LINQ to SQL würde den obigen Ausdruck Baum

SELECT * FROM COMPUTERSCIENTIST WHERE NAME = 'Alan Turing' 

umwandeln kann es tun, dass aufgrund der Darstellung des Lambda-Ausdruck als ein Baum, dessen Knoten begehbar und inspiziert werden.

3

Ein Ausdruck ermöglicht es Ihnen, die Struktur des Codes innerhalb des Delegaten zu überprüfen, anstatt nur den Delegaten selbst zu speichern.

Wie üblich MSDN in der Sache ziemlich klar:

MSDN - Expression(TDelegate)

+0

Danke, diese Zeile in der MSDN-Referenz half: * eine In-Memory-Datendarstellung des Lambda-Ausdrucks * – Khan

0

Ja, Func<> kann anstelle der Stelle eines Ausdrucks verwendet werden. Das Dienstprogramm eines Ausdrucksbaums ermöglicht entfernten LINQ-Anbietern wie LINQ to SQL die Möglichkeit, nach vorne zu schauen und zu sehen, welche Anweisungen erforderlich sind, damit die Abfrage funktionieren kann. Mit anderen Worten, Code als Daten zu behandeln.

 //run the debugger and float over multBy2. It will be able to tell you that it is an method, but it can't tell you what the implementation is. 
     Func<int, int> multBy2 = x => 2 * x; 
     //float over this and it will tell you what the implmentation is, the parameters, the method body and other data 
     System.Linq.Expressions.Expression<Func<int, int>> expression = x => 2 * x; 

Im obigen Code können Sie vergleichen, welche Daten über den Debugger verfügbar sind. Ich lade Sie ein, dies zu tun. Sie werden sehen, dass Func sehr wenig Informationen zur Verfügung hat. Versuchen Sie es erneut mit Expressions und Sie werden eine Menge Informationen sehen, einschließlich des Methodenhauptteils und der Parameter, die zur Laufzeit sichtbar sind. Das ist die wahre Kraft von Expression Trees.

Verwandte Themen