MSDN文档声明:
Expression.Quote
方法创建一个 代表一个的UnaryExpression 具有常量值的表达式 类型表达式。
我已经能够通过使用Expression类手动构建谓词表达式来构建用于LINQ查询的谓词表达式,但从未遇到过对Expression.Quote的需求。
你何时以及为何使用这个?从我见过的LINQ表达式中可以看出,它们似乎只是在不添加任何值的情况下包装现有表达式。
Quote方法/节点类型的目的是什么?
答案 0 :(得分:25)
Expression.Quote
指定将lambda视为表达式树而不是函数。它在其操作数上引发闭包语义。
使用MethodCallExpression
构建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
。< / p>
我通过反射器查看Expression.Quote
,而唯一参数的类型为Expression
,它必须从LambdaExpression
派生,并在方法内部进行检查。出于兴趣,任何人都知道为什么MS不只是将参数类型设为LambdaExpression
?
正如StevenH所指出的,Expression.Quote
用于实现LINQ查询提供程序。采用Queryable
,Where
,OrderBy
等lambda表达式的GroupBy
上的所有方法都使用MethodCallExpression
在内部构建Expression.Call
,用Expression.Quote
调用包装lambda表达式参数。
有关Expression.Quote
的更详细说明,请阅读此answer。