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