die variable " Typ " verwiesen wird, vom Anwendungsbereich ", aber es ist nicht definiert
Gut, der folgende code ist selbsterklärend; ich möchte Sie kombinieren zwei Ausdrücke in eine mit And
Betreiber. Die Letzte Zeile bewirkt, dass rune-Zeit der Fehler:
Zusätzliche Informationen: variable 'y' vom Typ 'System.String' referenziert von scope ", aber es ist nicht definiert
Code:
Expression<Func<string, bool>> e1 = y => y.Length < 100;
Expression<Func<string, bool>> e2 = y => y.Length < 200;
var e3 = Expression.And(e1.Body, e2.Body);
var e4 = Expression.Lambda<Func<string, bool>>(e3, e1.Parameters.ToArray());
e4.Compile(); //<--- causes run-time error
InformationsquelleAutor der Frage Hans | 2015-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass parameter-Ausdruck Objekte, die Sie repräsentiert variable
y
in Ausdrückene1
unde2
unterschiedlich sind. Die Tatsache, dass die beiden Variablen den gleichen Namen und den gleichen Typ spielt keine Rolle:e1.Parameters.First()
unde2.Parameters.First()
ist nicht das gleiche Objekt.Dieser verursacht das problem, das Sie sehen: nur
e1
's parametery
stehtLambda<>
währende2
's parametery
ist out of scope.Dieses problem zu beheben, verwenden Sie
Expression
APIs zu erstellene1
unde2
. Auf diese Weise würden Sie in der Lage sein zu teilen, die parameter Ausdruck über Sie, so dass das problem der Rahmen.InformationsquelleAutor der Antwort dasblinkenlight
Wie in der anderen Antwort, Sie haben zwei Ausdrücke, bei denen beide haben einen parameter mit dem Namen
y
. Diese werden nicht automatisch miteinander in Beziehung.Richtig zu kompilieren Ausdruck, müssen Sie die Quell-Ausdruck Parameter:
Natürlich, Sie würden wollen, ein Ausdruck, der verbindet die beiden Ausdrücke mit nur einem parameter. Sie können neu erstellen, die Ausdrücke wie diese:
Als für Ihren Kommentar, dass Sie nicht wollen, um den Wiederaufbau der Ausdruck, aber tun Sie es auf eine vorhandene expression Körper und Parameter: dies funktioniert mit
ExpressionRewriter
aus Die Kombination von zwei lambda-Ausdrücke in c# undAndAlso
aus Ersetzen Sie die parameter-Namen in den Körper eines Ausdrucks:InformationsquelleAutor der Antwort CodeCaster
Danke an alle mitgewirkt.
Als dasblinkenlight wies auf die zwei Parameter der beiden Ausdrücke sind nicht das gleiche. Grund? Gut, es ist der compiler, der trick. Beim kompilieren, es wird eine Klasse für den einzelnen Ausdruck und benennen Sie die einzelnen parameter etwas wie xxx1, xxx2,... völlig anders aus als die ursprünglichen Namen.
Und die Antwort für .Net 4.0+:
Wie Kombinieren Sie zwei lambdas
InformationsquelleAutor der Antwort Hans