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<T>(Expression<Func<T, bool>> expression) where T : class, new();
我把它读成:
删除T
类型的对象,方法是传入一个lambda 表达式,其参数是T
类型的对象,返回一个bool
。
还有,你能换吗
Func<T, bool> expression
和
Predicate<T> expression
【问题讨论】:
我认为您在将方法签名从 IDE 转移到页面时犯了一个错误,没有提到 T 你是对的,我的降价是错误的。 【参考方案1】:这个方法可能是 collection 类型的成员,是吗?
“谓词”是对“这个东西是那个集合的成员吗?”这个问题说“是”或“否”的任何设备。所以集合“整数甚至正整数”的谓词是x=> x > 0 && x % 2 == 0
。
此方法可能具有“从集合中删除由谓词标识的集合中的所有集合成员”的语义。
谓词以表达式树的形式传递给方法,这是一种传递谓词的结构的方式,可以在运行时进行分析和转换。它通常用于“集合”实际上是某处的数据库,删除请求需要翻译成数据库查询语言的查询并通过网络发送的场景。
【讨论】:
是的,这里的Delete对要持久化到数据库的集合进行操作。我喜欢你使用的语义。 @EricLippert:怎么叫/【参考方案2】:第一个是接受表达式树的方法(不一定从 lambda 表达式树创建)。表达式树表示接受T
并返回bool
的表达式。 T
被限制为具有无参数构造函数的引用类型。
至于语义 - 这取决于文档/实现。
区分 lambda 表达式(创建表达式树的一种方式)和表达式树本身很重要。
至于它是否可以改用Predicate<T>
- 也许。这取决于实现对它的作用。它们代表相同的委托签名,当然——但你不能轻易地在两种类型的表达式树之间进行转换。
【讨论】:
感谢您更正已发布代码 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>> 转换为字符串