Laden...

[gelöst] ExpressionTrees/ExpressionVisitor: Wie lokale Variable "als Zahl" in Tree behandeln

Erstellt von sth_Weird vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.306 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren
[gelöst] ExpressionTrees/ExpressionVisitor: Wie lokale Variable "als Zahl" in Tree behandeln

hallo,
Ich würde gerne eine Expression<Func<T,Res>> in String-Form ausgeben.
Dafür habe ich einen ExpressionVisitor implememtiert (von der abstrakten Basisklasse abgeleitet).
Soweit so gut, nur die Parameter werden nicht so angezeigt, wie ich das gerne hätte.
Eine einfache Expression sieht z.B. so aus:


p => p.Age >= myLocalIntVariable

myLocalIntVariable ist eine lokale int-Variable in einer Funktion (der Wert wird aus der GUI ausgelesen).
Im ExpressionTree ist myLocalIntVariable eine ConstantExpression. Ich möchte hier den Wert ausgeben, der dort gespeichert ist. Leider steht im .Value Property der ConstantExpression was "kryptisches" drin, und nicht der einfache Zahlenwert, den ich haben möchte. Ich habe nun soviel über ConstantExpressions gelesen, dass ich weiß, dass da ein Zwischenspeicher für den Wert erzeugt wird, in dem Value als object gespeichert wird. Wenn ich beim Debuggen die ConstantExpression im QuickWatch angucke, kann ich das Value Property aufklappen und sehe dann den tatsächlichen Zahlenwert, der drin steht. Aber über den Code scheine ich da so nicht ran zu kommen.
Ich habe Beispielcode gefunden, wie ich einen ExpressionTree selbst aufbaue, und so mit bestimmten Tricks erreichen kann, dass meine lokale Variable wirklich als Wert in den ExpressionTree reinwandert (also so als hätte ich geschrieben p => p.Age ≥ 5 oder so). Das ist natürlich wesentlich komplizierter als die Syntax oben. Daher frage ich mich, ob ich man nicht mit einfacheren Mitteln zum gleichen Ziel kommt... Ich habe nämlich zum Teil verschachtelte Prüfungen, wie p => p.x.y.z > a.b.c, und denke den Tree da händisch aufzubauen wird doch ganz schön komplex...
Auch über alternative, einfache Wege zum Ziel wäre ich dankbar.
(ich habe schonmal gelesen dass man durch compilen der Expression weiter kommen könnte, aber das sei sehr langsam, und da ich die Expression auf viele Datensätze loslassen will 😕 ...)

gruß & danke
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

3.003 Beiträge seit 2006
vor 7 Jahren

Was du möchtest, ist den Inhalt der lokalen Variable, die deine ConstantExpression darstellt, richtig? Dh. du möchtest den Inhalt der Variable zu jenem Zeitpunkt auswerten. Diesen Vorgang (Auswerten des Inhalts zur Laufzeit) nennt man auch compiling. Mit anderen Worten: wenn du den Inhalt auswerten möchtest, musst du (zumindest die ConstantExpression) kompilieren. Anders geht's nicht, denn vorher ist deine ConstantExpression nichts weiter als der Verweis auf eine lokale Variable.

(und "langsam" ist relativ, by the way.)

Grüße,

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren

Hmm, dann komme ich wohl nicht um das compilen drum rum...
Danke für die Antwort!

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+