我已经阅读了this answer并从中理解了它所突出的具体情况,即当您在一个lambda内部有另一个lambda时,您不希望内部lambda也意外地与外部lambda一起编译。当编译外部lambda时,您希望内部lambda表达式仍然保持为表达式树。在这种情况下,引用内部lambda表达式是有意义的。
事实上,不用引号也可以正常工作。
如果我确实引用了该参数,它会出错,并提示我正在向
这是怎么回事?这个引号有什么意义?
但我认为就只有这样了。还有其他引用lambda表达式的用例吗?
如果没有,那么为什么所有LINQ操作符(即在Queryable
类中声明的IQueryable<T>
上的扩展),当它们将谓词或lambda作为参数封装到MethodCallExpression
中时,都会引用它们。
我尝试了一个示例(以及过去几天的其他示例),在这种情况下引用lambda似乎毫无意义。
这是对期望lambda表达式(而不是委托实例)作为其唯一参数的方法调用表达式。
然后,我通过将其包装在lambda中来编译MethodCallExpression
。
LambdaExpression
(GimmeExpression
方法的参数)。它将内部lambda表达式保留为表达式树,而不是制作其委托实例。事实上,不用引号也可以正常工作。
如果我确实引用了该参数,它会出错,并提示我正在向
GimmeExpression
方法传递错误类型的参数。这是怎么回事?这个引号有什么意义?
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());
}