Ich habe this answer gelesen und daraus den spezifischen Fall, den es hervorhebt, was ist, wenn Sie ein Lambda in einem anderen Lambda haben und Sie nicht versehentlich das innere Lambda auch mit dem äußeren Lambda kompilieren wollen. Wenn der äußere Lambda-Ausdruck kompiliert wird, soll der innere Lambda-Ausdruck ein Ausdrucksbaum bleiben. Da ist es ja sinnvoll, den inneren Lambda-Ausdruck zu zitieren.Warum würden Sie eine LambdaExpression zitieren?
Aber das ist es, glaube ich. Gibt es einen anderen Anwendungsfall für die Angabe eines Lambda-Ausdrucks?
Und wenn es nicht, warum all LINQ-Operatoren zu tun, das heißt, die Erweiterungen auf IQueryable<T>
, die die Prädikate oder Lambda-Ausdrücke in dem Queryable
Klasse Zitat deklariert werden sie als Argument erhalten, wenn sie in den MethodCallExpression
diese Informationen verpacken.
Ich habe ein Beispiel (und ein paar andere in den letzten Tagen) versucht und es scheint keinen Sinn zu machen, ein Lambda in diesem Fall zu zitieren.
Hier ist ein Methodenaufruf-Ausdruck für eine Methode, die einen Lambda-Ausdruck (und keine Delegate-Instanz) als einzigen Parameter erwartet.
Ich kompiliere dann die MethodCallExpression
durch Einwickeln in ein Lambda.
Aber das kompiliert nicht die innere LambdaExpression
(das Argument zu der GimmeExpression
Methode) auch. Er hinterlässt den inneren Lambda-Ausdruck als Ausdrucksbaum und macht keine Delegierteninstanz daraus.
In der Tat funktioniert es gut, ohne es zu zitieren.
Und wenn ich das Argument zitieren, bricht es und gibt mir einen Fehler, der angibt, dass ich die falsche Art von Argument an die GimmeExpression
Methode übergeben.
Was ist das Geschäft? Worum geht es bei diesem Zitat?
private static void TestMethodCallCompilation()
{
var methodInfo = typeof(Program).GetMethod("GimmeExpression",
BindingFlags.NonPublic | BindingFlags.Static);
var lambdaExpression = Expression.Lambda<Func<bool>>(Expression.Constant(true));
var methodCallExpression = Expression.Call(null, methodInfo, lambdaExpression);
var wrapperLambda = Expression.Lambda(methodCallExpression);
wrapperLambda.Compile().DynamicInvoke();
}
private static void GimmeExpression(Expression<Func<bool>> exp)
{
Console.WriteLine(exp.GetType());
Console.WriteLine("Compiling and executing expression...");
Console.WriteLine(exp.Compile().Invoke());
}
Vielen Dank. Ich war jetzt seit mehreren Monaten hier. Es klickte schließlich nach vielen Beispielen und dachte viel in den letzten Monaten darüber nach. Ich hatte einige Theorien über das Warum und einige von ihnen hatten Recht. Ihre Antwort hat mir auch geholfen. –