Gid*_*sey 42 linq expression linq-expressions
MSDN文档说明:
Expression.Quote
方法创建一个UnaryExpression,表示具有Expression类型的常量值的表达式.
我已经能够通过使用Expression类手动构建它们来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求.
你何时以及为何使用这个?从我见过的LINQ表达式中看到它们,它们似乎只是在不添加任何值的情况下包装现有表达式.
Quote方法/节点类型的目的是什么?
Gid*_*sey 26
Expression.Quote
指定将lambda视为表达式树而不是函数.它在其操作数上引发闭包语义.
在构造MethodCallExpression
using时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
阅读此答案的更详细说明.