Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Expression<Func<T, T>> aus string erzeugen?
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Golo Roden,

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

herbivore
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Hallo,
Zitat von Golo Roden
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Golo Roden,
Zitat
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
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
0815Coder
myCSharp.de - Member



Dabei seit:
Beiträge: 770

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4649
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers