Erstellen einer LINQ-Ausdrucksbaumstruktur: Ermitteln der Variablen im Gültigkeitsbereich

.net c# expression-trees lambda linq

Frage

Ich $var1 eine LINQ-Ausdrucksbaumstruktur, aber sie wird nicht kompiliert, weil angeblich die lokale Variable $var1 außerhalb des Geltungsbereiches liegt:

Variable '' vom Typ 'System.Object' referenziert von Bereich '', aber es ist nicht definiert

Dies ist der Ausdrucksbaum:

.Block() {
    $var1;
    .If ($n.Property1 == null) {
        .Block() {
            $var1 = null;
            .Return #Label1 { }
        }
    } .Else {
        .Default(System.Void)
    };
    $var1 = (System.Object)($n.Property1).Length;
    .Label
    .LabelTarget #Label1:;
    $var1
}

Der folgende Code ist für das Erstellen des Baums verantwortlich. Es ist Teil von etwas Größerem, deshalb erwarte ich nicht, dass sein Zweck von diesem Beispiel vollkommen klar ist.

.Block() {
    $var1;
    .If ($n.Property1 == null) {
        .Block() {
            $var1 = null;
            .Return #Label1 { }
        }
    } .Else {
        .Default(System.Void)
    };
    $var1 = (System.Object)($n.Property1).Length;
    .Label
    .LabelTarget #Label1:;
    $var1
}

Die Frage ist also: Wie bekomme ich die lokale Variable in den Geltungsbereich, damit der Ausdruck erfolgreich kompiliert wird?

Akzeptierte Antwort

Wenn Sie die Expression.Variable zur Liste der "normalen" Ausdrücke im Block hinzufügen, sollten Sie die Überladung verwenden, die die deklarierten Variablen für den Block separat angibt :

Expression finalExpression = Expression.Block(new[] { resultVariable },
                                              expressions);

(Und den Aufruf von expressions.Add(resultVariable); ) entfernen




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum