在带有委托的方法中使用Expression <t>的实际意义</t>

时间:2013-03-21 10:26:03

标签: c# delegates implementation

使用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>定义签名?

1 个答案:

答案 0 :(得分:0)

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

我想到您可能需要访问AST的案例:

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

简而言之,如果您不需要Expression&lt; T&gt;,请不要使用Expression&lt; T&gt;。