![](/img/trans.png)
[英]Convert Expression<Func<T,T,bool>> to Expression<Func<T,bool>>
[英]What does the Expression<Func<T,bool>> declaration mean?
有人可以用一种方式解释下面的声明,它表达了表达式的含义以及如何调用它?
void Delete<T>(Expression<Func<T, bool>> expression) where T : class, new();
我将其读作:通过传入一个lambda表达式来删除类型为T
的对象,该表达式的参数是返回bool
的类型为T
的对象。
此外,你可以用Predicate<T> expression
替换Func<T, bool> expression
Predicate<T> expression
这个方法可能是集合类型的成员,是吗?
“谓词”是对问题“是”还是“否”的任何设备“这个东西是该集合的成员吗?” 所以集合“整数甚至正整数”的谓词将是x=> x > 0 && x % 2 == 0
。
此方法可能具有“从集合中删除集合中由谓词标识的集合中的所有成员”的语义。
谓词以表达式树的形式传递给方法,表达式树是一种以可在运行时分析并转换的方式传递谓词结构的方法。 它通常用于“集合”实际上是某个地方的数据库的情况,并且删除请求需要以数据库的查询语言转换为查询并通过网络发送。
第一种是接受表达式树的方法(不一定是从lambda表达式树创建的)。 表达式树表示接受T
并返回bool
的表达式。 T
被约束为具有无参数构造函数的引用类型。
至于语义含义 - 这取决于文档/实现。
区分lambda表达式和表达式树本身很重要,lambda表达式是创建表达式树的一种方式。
至于它是否可以使用Predicate<T>
- 也许。 这取决于实现对它的作用。 它们代表相同的委托签名 ,当然 - 但是你不能轻易地在两种类型的表达式树之间进行转换。
此方法作为函数的参数表达式树获取,使用公共无参数构造函数获取对象并返回boolean。
您可以在此处阅读有关表达式树及其用法的更多信息: http : //msdn.microsoft.com/en-us/library/bb397951.aspx
虽然方法签名对我来说看起来无效,但实际上您传入的是表达式树(它可能不是LambdaExpression
类型,因为Expression
是所有表达式类型的抽象基类)。
类型约束声明T必须是引用类型(从类继承,不能是值类型(读取:struct))并且还必须定义默认构造函数。
编辑:见下面Jon的回答,他更正了签名并从那里正确回答了问题,提供了比我更多的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.