Laden...

Expression<Func<T, T>> aus string erzeugen?

Erstellt von Golo Roden vor 15 Jahren Letzter Beitrag vor 15 Jahren 7.135 Views
Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren
Expression<Func<T, T>> aus string erzeugen?

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

www.goloroden.de
www.des-eisbaeren-blog.de

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Golo Roden,

du wirst eine Methode Expression.Parse (String) schreiben müssen.

herbivore

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

49.485 Beiträge seit 2005
vor 15 Jahren

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

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

2.891 Beiträge seit 2004
vor 15 Jahren

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

49.485 Beiträge seit 2005
vor 15 Jahren

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

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

0
767 Beiträge seit 2005
vor 15 Jahren

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

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de