【发布时间】:2015-05-07 15:14:31
【问题描述】:
我已经阅读了this answer 并从中了解了它突出显示的特定情况,即当您在另一个 lambda 中有一个 lambda 并且您不想意外地让内部 lambda 也与外部 lambda 一起编译时。编译外部的 lambda 表达式时,您希望内部 lambda 表达式保持为表达式树。在那里,是的,引用内部 lambda 表达式是有意义的。
但仅此而已,我相信。还有其他引用 lambda 表达式的用例吗?
如果没有,为什么所有 LINQ 运算符,即在 Queryable 类中声明的 IQueryable<T> 上的扩展,在将信息打包到 @ 时引用它们作为参数接收的谓词或 lambda 987654324@.
我尝试了一个示例(以及过去几天中的其他几个示例),在这种情况下引用 lambda 似乎没有任何意义。
这是一个方法调用表达式,该方法需要一个 lambda 表达式(而不是委托实例)作为其唯一参数。
然后我通过将 MethodCallExpression 包装在 lambda 中来编译它。
但这也不会编译内部 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());
}
【问题讨论】:
标签: c# linq lambda linq-expressions custom-linq-providers