C#中expression.Compile()()双括号语法含义技术咨询
拆解C#中
expression.Compile()()的双括号语法 嘿,这个语法乍一看确实有点迷惑,我来一步步给你讲清楚它到底在做什么:
第一步:expression.Compile()——把表达式树变成可执行委托
你的方法参数是Expression<Func<IEnumerable<T>>>,这是一个表达式树,它本质上是一段代码的抽象描述,不是直接能运行的逻辑。Compile()方法的作用就是把这个表达式树编译成一个Func<IEnumerable<T>>类型的委托——简单说,就是把“描述如何获取集合”的代码,转换成一个可以直接调用的无参函数,这个函数执行后会返回你要的IEnumerable<T>集合。
第二步:第二个()——调用这个委托获取实际值
既然Compile()返回的是一个无参委托(就像一个没有参数的方法),那要拿到它的返回值,就必须像调用普通无参方法一样加上括号()。这一步就是执行这个委托,最终获取到request.PersonIds的实际实例(也就是那个List<int>)。
换个写法更直观
你完全可以把这行代码拆成两行,逻辑是完全一样的:
// 先编译得到委托 Func<IEnumerable<T>> getCollectionDelegate = expression.Compile(); // 再调用委托获取值 IEnumerable<T> value = getCollectionDelegate();
而expression.Compile()()只是把这两步合并成了一行写法而已。
结合你的代码场景来看:当你调用_validator.NotEmpty(() => request.PersonIds)时,lambda表达式() => request.PersonIds被包装成表达式树传入方法。Compile()把它转换成能获取request.PersonIds的委托,再通过()调用这个委托拿到集合,最后才能判断集合是否为null或者没有元素。
内容的提问来源于stack exchange,提问作者Marun Gordon
相关产品推荐
相关产品推荐

