使用Expression在带有委托的方法中
本文关键字:方法 Expression 使用 | 更新日期: 2023-09-27 18:05:09
使用Linq.Expression<T>
类型,我们可以通过编程方式定义AST,以便以后求值和/或执行。
但实际上,这样定义方法签名的含义是什么呢?
public void SomeMethod1(Func<bool> func) { ... } // 1.
不是public void SomeMethod2(Expression<Func<bool>> expr) { ... } // 2.
显然,我们从Func<bool>
得到结果的方式不同于:
var result = func(); // 1.
var func = expr.Compile() // 2.
var result = func();
在原始的实际级别上调用也是类似的:
SomeMethod1(() => true); // A.
SomeMethod1(() => AMethodReturnsABool()); // B.
SomeMethod1(AMethodReturnsABool); // C.
不同的是SomeMethod2
在编译层不接受method-group语法:
//SomeMethod2(AMethodReturnsABool); // -> don't compile
当我需要用标准委托Action<T,...>
或Func<T,..>
定义签名时,我应该在Expression<T>
中定义它们?
简单。如果您不需要访问您的LINQ表达式的AST,请使用编译(匿名委托)版本。
我认为您可能需要访问AST的情况:
- 将AST转换为其他内容,如SQL where子句。
- 分析编写代码的一些属性
- 以编程方式构建委托。例如,构建Expression
对象从某些用户输入中取出。这可以省去编写带有其IL翻译器的AST的麻烦。 - 压缩数据访问层,以便能够使用LinqToSQL或具有相同LINQ查询规范的简单内存列表。
总之,如果你不需要Expression