LINQ的Expression.Quote方法的目的是什么?

Gid*_*sey 42 linq expression linq-expressions

MSDN文档说明:

Expression.Quote

方法创建一个UnaryExpression,表示具有Expression类型的常量值的表达式.

我已经能够通过使用Expression类手动构建它们来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求.

你何时以及为何使用这个?从我见过的LINQ表达式中看到它们,它们似乎只是在不添加任何值的情况下包装现有表达式.

Quote方法/节点类型的目的是什么?

Gid*_*sey 26

Expression.Quote指定将lambda视为表达式树而不是函数.它在其操作数上引发闭包语义.

在构造MethodCallExpressionusing时Expression.Call,任何lambda表达式(LambdaExpression/ Expression<TDelegate>)的参数都必须用于Expression.Quote在传入之前包装参数.

因此对于类型的参数Expression<Func<bool>>,当您创建一个实例,例如:时() => true,表达式的Type属性将是,Func<bool>而表达式的类型(调用GetType)将是Expression<Func<bool>>

因此,为了获得Expression具有正确的Type属性值,您将lambda表达式传递给Expression.Quote并将其作为参数传递给Expression.Call.

Expression.Quote通过反射器看了一下,虽然唯一的参数是类型Expression,但它必须从中派生出来LambdaExpression并在方法内部进行检查.出于兴趣,任何人都知道为什么MS不只是使参数类型成为LambdaExpression

正如StevenH所指出的,Expression.Quote用于实现LINQ查询提供程序.所有的方法Queryable称取lambda表达式如Where,OrderBy,GroupBy等内部的构建MethodCallExpression使用Expression.Call与包裹lambda表达式参数Expression.Quote的呼叫.

有关Expression.Quote阅读此答案的更详细说明.