使用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>中定义它们?

使用Expression<T>在带有委托的方法中

简单。如果您不需要访问您的LINQ表达式的AST,请使用编译(匿名委托)版本。

我认为您可能需要访问AST的情况:

  • 将AST转换为其他内容,如SQL where子句。
  • 分析编写代码的一些属性
  • 以编程方式构建委托。例如,构建Expression对象从某些用户输入中取出。这可以省去编写带有其IL翻译器的AST的麻烦。
  • 压缩数据访问层,以便能够使用LinqToSQL或具有相同LINQ查询规范的简单内存列表。

总之,如果你不需要Expression,就不要使用Expression