使用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>
定义签名?
答案 0 :(得分:0)
易。如果您不需要访问LINQ表达式的AST,请使用已编译的(匿名委托)版本。
我想到您可能需要访问AST的案例:
简而言之,如果您不需要Expression&lt; T&gt;,请不要使用Expression&lt; T&gt;。