47

MSDN 文档指出:

表达式.引用

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

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

您何时以及为什么要使用它?从我看到的拥有它们的 LINQ 表达式来看,它们似乎只是包装了现有的表达式而没有添加任何值。

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

4

1 回答 1

31

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

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

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

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

我通过反射器看了看,Expression.Quote虽然唯一的参数是 type Expression,但它必须派生自LambdaExpression,并且在方法内部进行了检查。出于兴趣,有人知道为什么 MS 不只是将参数类型设为LambdaExpression吗?

正如 StevenH 所指出的,Expression.Quote用于实现 LINQ 查询提供程序。其上的所有方法Queryable都采用 lambda 表达式,例如Where, OrderBy,GroupBy等在内部构造一个MethodCallExpressionusing并用调用Expression.Call包装 lambda 表达式参数。Expression.Quote

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

于 2013-10-02T22:43:03.750 回答