MSDN 文档指出:
表达式.引用
方法 创建一个 UnaryExpression,它表示具有 Expression 类型的常量值的表达式。
我已经能够通过使用 Expression 类手动构建谓词表达式来构建用于 LINQ 查询的谓词表达式,但从未遇到过对 Expression.Quote 的需求。
您何时以及为什么要使用它?从我看到的拥有它们的 LINQ 表达式来看,它们似乎只是包装了现有的表达式而没有添加任何值。
Quote 方法/节点类型的用途是什么?
MSDN 文档指出:
表达式.引用
方法 创建一个 UnaryExpression,它表示具有 Expression 类型的常量值的表达式。
我已经能够通过使用 Expression 类手动构建谓词表达式来构建用于 LINQ 查询的谓词表达式,但从未遇到过对 Expression.Quote 的需求。
您何时以及为什么要使用它?从我看到的拥有它们的 LINQ 表达式来看,它们似乎只是包装了现有的表达式而没有添加任何值。
Quote 方法/节点类型的用途是什么?
Expression.Quote
指定将 lambda 视为表达式树而不是函数。它在其操作数上引入闭包语义。
在构造MethodCallExpression
usingExpression.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
等在内部构造一个MethodCallExpression
using并用调用Expression.Call
包装 lambda 表达式参数。Expression.Quote
有关Expression.Quote
阅读此答案的更详细说明。