Lambda Expression Tree-Parsing
Ich versuche, die Verwendung von Lambda-Ausdrücken in ein Projekt anzeigen zu einem Dritten query-API. So, ich bin durch analysieren der Expression tree von der hand.
Wenn ich pass in ein lambda-Ausdruck wie:
p => p.Title == "title"
alles funktioniert.
Jedoch, wenn meine lambda-Ausdruck sieht wie folgt aus:
p => p.Title == myaspdropdown.SelectedValue
Mithilfe der .NET-debugger, sehe ich nicht den eigentlichen Wert, die funciton. Stattdessen sehe ich so etwas wie:
p => p.Title = (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)
Was gibt? Und wenn ich versuche, die Rechte Seite des Ausdrucks als string, bekomme ich (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)
anstelle des tatsächlichen Wertes. Wie bekomme ich den tatsächlichen Wert?
InformationsquelleAutor der Frage Keith Fitzgerald | 2008-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie daran, dass wenn Sie den Umgang mit dem lambda-Ausdruck als Ausdruck Baum, Sie müssen nicht ausführbaren code. Vielmehr haben Sie einen Baum, der Ausdruck der Elemente, aus denen der Ausdruck, den Sie schrieb.
Charlie Calvert hat ein guter Beitrag auf und diskutiert diese im detail. Im Lieferumfang enthalten ist ein Beispiel für die Verwendung eines Ausdrucks visualiser für debugging Ausdrücke.
In Ihrem Fall, um den Wert der rechten Seite der Gleichheit Ausdruck, müssen Sie zum erstellen einer neuen lambda-Ausdruck, kompilieren Sie es und starten Sie es.
Habe ich gehackt zusammen ein kurzes Beispiel dafür - hoffe es hält, was, die Sie brauchen.
InformationsquelleAutor der Antwort Bevan
Um den tatsächlichen Wert, Sie müssen, um die Logik des expression tree zu welchem Rahmen du hast.
Der springende Punkt bei der expression von Bäumen ist, dass Sie repräsentieren die Logik als Daten und nicht als der Ausdruck evaluiert wird. Sie müssen herausfinden, was den lambda-Ausdruck wirklich bedeutet. Das kann bedeuten, bewerten einige Teile davon gegen die lokalen Daten müssen Sie entscheiden, für sich selbst. Ausdruck Bäume sind sehr mächtig, aber es ist nicht eine einfache Sache zu analysieren und zu nutzen. (Fragen Sie irgendjemanden, der ' s geschrieben einen LINQ-provider... Frans Bouma hat, beklagt die Schwierigkeiten, mehrmals.)
InformationsquelleAutor der Antwort Jon Skeet
Nur Schwierigkeiten mit genau dem gleichen Problem, Dank Bevan. Auf eine Erweiterung, die folgende ist ein Allgemeines Muster, das Sie verwenden können, zu extrahieren Sie den Wert (die Verwendung dieses in meinem query engine).
InformationsquelleAutor der Antwort squirrel
Ich bin mir nicht sicher, ob ich verstehe. Wo sind Sie "sehen"? Ist, dass zur design-Zeit oder zur Laufzeit? Lambda-Ausdrücke gedacht werden kann, im wesentlichen als anonyme Delegaten, und betreiben wird mit verzögerter Ausführung. Daher sollten Sie nicht erwarten, zu sehen, der Wert zugewiesen, bis nach der Ausführung bestanden hat, die Linie, offensichtlich.
Ich glaube nicht, dass das wirklich was du meinst, aber... wenn Sie klären die Frage ein wenig kann ich vielleicht helfen 🙂
InformationsquelleAutor der Antwort Grank