Hallo,
ich habe einen Expressiontree vom Typ Expression<Func<string, string>> in einen String umgewandelt, so dass im String nun der eigentliche Code steht.
Wie kann ich aus diesem String, der den Code enthält, den Expressiontree vom Typ Expression<Func<string, string>> wieder erzeugen?
Viele Grüße,
Golo
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo Golo Roden,
du wirst eine Methode Expression.Parse (String) schreiben müssen.
herbivore
Hm, okay ... gibt's so was nicht irgendwo schon vorgefertigt? Bin doch vermutlich nicht der erste, der so was braucht 😉 ...
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo Golo Roden,
es gibt Parser-Generatoren wie den Klassiker yacc. Aber die sind für einfache Sachen oft überdimensioniert. So schwer ist das für einfache Ausdrücke auch from scratch nicht. Siehe z.B. [ERLEDIGT] StringToBool - Parser
herbivore
Hallo,
hm, also irgendwie stehe ich nach wie vor auf dem Schlauch ... ich habe auf der linken Seite
Expression<Func<string, string>> transformFunc =
und auf der rechten Seite zum Beispiel so etwas wie
"c => c.ToLower()"
Wie bekomme ich das nun zusammen? Selbst wenn ich den String parse und in "c", "=>" und "c.ToLower()" zerlege, habe ich doch nach wie vor nur Strings - was mache ich dann damit?
Viele Grüße,
Golo
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo,
und auf der rechten Seite zum Beispiel so etwas wie
"c => c.ToLower()"
Hm, wie komplex kann denn die rechte Seite aussehen?
Ich kann dir nur erstmal ein paar Stichworte nennen, mit denen ich meine Recherche anfangen würde: Member(Access?)Expression und LambdaExpression.Compile
(beim LINQ-Provider muss man es anders herum machen [Expression->Irgendwas], ich würde erwarten, dass man das auch in deine gewünschte Richtung hinbekommt.)
Gruß
dN!3L
Hallo Golo Roden,
Selbst wenn ich den String parse und in "c", "=>" und "c.ToLower()" zerlege, habe ich doch nach wie vor nur Strings - was mache ich dann damit?
wenn du bei den Tokens angekommen bist, musst du daraus/dazu natürlich die passenden Objekte erzeugen.
herbivore
Da der Ausdruck auf der rechten Seite aber beliebig komplex werden kann, muss ich quasi meinen eigenen C#-Parser schreiben ... na gute Nacht 😦
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
vielleicht hilft dann der CSharpCodeProvider weiter... sprich du kompilierst was du willst einfach... im Prinzip brauchst du nur etwas Code um die Lambda Expression herum erzeugen.
loop:
btst #6,$bfe001
bne.s loop
rts
Okay, es geht doch - und zwar deutlich simpler: Mit den LINQ Dynamic Query Expressions führt Microsoft eine Parse- und eine ParseLambda-Methode ein, die einen Expressiontree beziehungsweise einen Lambdaausdruck aus einem String erzeugen.
Genau das war's, was ich brauchte 🙂.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Beispiel:
Expression<Func<string, string>> transformFunc = DynamicExpression.ParseLambda<string, string>("it => it.ToLower()");
Das it steht dabei für die Parameterinstanz.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden