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(调用GetType
) Expression<Func<bool>>
因此,要获取具有Type
属性的正确值的Expression
,请将该lambdaexpression式传递到Expression.Quote
,并将其作为parameter passing给Expression.Call
。
我看了Expression.Quote
通过reflection器,而唯一的参数是typesExpression
,它必须从LambdaExpression
派生,这是在方法内部检查。 出于兴趣,任何人都知道为什么MS不只是使参数types为LambdaExpression
?
正如StevenH指出的那样, Expression.Quote
用于实现LINQ查询提供程序。 Queryable
上的所有方法(如Where
, OrderBy
, GroupBy
等)使用Expression.Call
在内部构造一个MethodCallExpression
并使用Expression.Quote
调用包装Lambdaexpression式参数。
有关Expression.Quote
的更详细的解释,请阅读此答案 。