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

MSDN文档指出:

Expression.Quote

方法创build一个UnaryExpression,它表示具有typesExpression的常量值的expression式。

我已经能够通过使用Expression类手动构build谓词expression式来构build用于LINQ查询的谓词expression式,但从来没有遇到过Expression.Quote的需求。

何时以及为什么要使用这个? 从我看到的LINQexpression式中,他们似乎只是在不添加任何值的情况下包装现有的expression式。

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

Expression.Quote指定将lambda视为expression式树而不是函数。 它引发操作数的闭包语义。

在使用Expression.Call构造MethodCallExpression ,任何属于lambdaexpression式( LambdaExpression / Expression<TDelegate> )的参数都必须在传入之前使用Expression.Quote来包装参数。

因此,对于types为Expression<Func<bool>>的参数,当您创build一个如: () => true的实例时,expression式的Type属性将为Func<bool>而expression式的types(调用GetTypeExpression<Func<bool>>

因此,要获取具有Type属性的正确值的Expression ,请将该lambdaexpression式传递到Expression.Quote ,并将其作为parameter passing给Expression.Call

我看了Expression.Quote通过reflection器,而唯一的参数是typesExpression ,它必须从LambdaExpression派生,这是在方法内部检查。 出于兴趣,任何人都知道为什么MS不只是使参数types为LambdaExpression

正如StevenH指出的那样, Expression.Quote用于实现LINQ查询提供程序。 Queryable上的所有方法(如WhereOrderByGroupBy等)使用Expression.Call在内部构造一个MethodCallExpression并使用Expression.Quote调用包装Lambdaexpression式参数。

有关Expression.Quote的更详细的解释,请阅读此答案 。