0

使用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处在于编译级别不接受方法组语法:

//SomeMethod2(AMethodReturnsABool); // -> don't compile

当我需要使用标准委托定义签名Action<T,...>Func<T,..>何时应该在Expression<T>?

4

1 回答 1

0

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

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

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

简而言之,如果你不需要 Expression<T>,就不要使用 Expression<T>。

于 2013-05-17T07:05:01.180 回答