Expression<Func<T,bool>> 声明是啥意思?

Posted

技术标签:

【中文标题】Expression<Func<T,bool>> 声明是啥意思?【英文标题】:What does the Expression<Func<T,bool>> declaration mean?Expression<Func<T,bool>> 声明是什么意思? 【发布时间】:2012-02-15 02:20:53 【问题描述】:

有人能以传达表达式含义以及如何调用它的方式解释以下声明吗?

void Delete&lt;T&gt;(Expression&lt;Func&lt;T, bool&gt;&gt; expression) where T : class, new();

我把它读成: 删除T 类型的对象,方法是传入一个lambda 表达式,其参数是T 类型的对象,返回一个bool

还有,你能换吗 Func&lt;T, bool&gt; expressionPredicate&lt;T&gt; expression

【问题讨论】:

我认为您在将方法签名从 IDE 转移到页面时犯了一个错误,没有提到 T 你是对的,我的降价是错误的。 【参考方案1】:

这个方法可能是 collection 类型的成员,是吗?

“谓词”是对“这个东西是那个集合的成员吗?”这个问题说“是”或“否”的任何设备。所以集合“整数甚至正整数”的谓词是x=&gt; x &gt; 0 &amp;&amp; x % 2 == 0

此方法可能具有“从集合中删除由谓词标识的集合中的所有集合成员”的语义。

谓词以表达式树的形式传递给方法,这是一种传递谓词的结构的方式,可以在运行时进行分析和转换。它通常用于“集合”实际上是某处的数据库,删除请求需要翻译成数据库查询语言的查询并通过网络发送的场景。

【讨论】:

是的,这里的Delete对要持久化到数据库的集合进行操作。我喜欢你使用的语义。 @EricLippert:怎么叫/【参考方案2】:

第一个是接受表达式树的方法(不一定从 lambda 表达式树创建)。表达式树表示接受T 并返回bool 的表达式。 T 被限制为具有无参数构造函数的引用类型。

至于语义 - 这取决于文档/实现。

区分 lambda 表达式(创建表达式树的一种方式)和表达式树本身很重要。

至于它是否可以改用Predicate&lt;T&gt; - 也许。这取决于实现对它的作用。它们代表相同的委托签名,当然——但你不能轻易地在两种类型的表达式树之间进行转换。

【讨论】:

感谢您更正已发布代码 Jon 中的签名 :)【参考方案3】:

此方法获取作为函数的参数表达式树,该函数使用公共无参数构造函数获取对象并返回布尔值。

您可以在此处阅读有关表达式树及其用法的更多信息: http://msdn.microsoft.com/en-us/library/bb397951.aspx

【讨论】:

【参考方案4】:

虽然方法签名在我看来无效,但实际上您是在传递表达式树(它可能不是 LambdaExpression 类型,因为 Expression 是所有表达式类型的抽象基类)。

类型约束规定 T 必须是引用类型(从类继承,不能是值类型(读取:结构))并且还必须定义默认构造函数。

编辑:请参阅下面 Jon 的回答,他更正了签名并从那里正确回答了问题,提供的信息比我多。

【讨论】:

以上是关于Expression<Func<T,bool>> 声明是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF

将 .net Func<T> 转换为 .net Expression<Func<T>>

Expression<Func<T,bool>> 声明是啥意思?

从 Expression<Func<T, bool>> 转换为字符串

将 Expression<Func<T, bool>> 作为参数传入的 Moq'ing 方法

AndAlso 在几个 Expression<Func<T, bool>> 之间:从范围引用