坚持简单的单一param lambda与bool返回值

时间:2016-06-12 09:37:53

标签: c# lambda

我遇到了一个带有int个参数和bool返回值的lambda:

Expression<Func<int, bool>> myFunc = x => x == 5;

首先,我尝试了这个,它返回了一个我无法理解的新Func;我期待一个true布尔值:

var boolResult = Expression.Lambda(myFunc).Compile().DynamicInvoke(5);

然后我试着明确地设置函数参数和返回类型:

var param = Expression.Parameter(typeof(int), "x");
var fn = Expression.Lambda<Func<int, bool>> (myFunc, param).Compile();

,但这会引发错误:

  

System.ArgumentException:类型的表达式   'System.Func`2 [System.Int32,System.Boolean]'不能用于返回   输入'System.Boolean'

这很奇怪,但我试图转换表达式:

var fn = Expression.Lambda<Func<int, bool>> (
    Expression.Convert(myFunc,
    typeof(Func<int, bool>))
    , param).Compile();
var boolResult = fn.Invoke(5);

,但这并没有帮助,并给出了同样的错误:

  

System.ArgumentException:类型的表达式   'System.Func`2 [System.Int32,System.Boolean]'不能用于返回   输入'System.Boolean'

知道我在这里做错了什么吗?

1 个答案:

答案 0 :(得分:2)

动态调用代码中的错误是构造lambda的方式。当您将myFunc作为表达式传递时,会得到一个返回Func<int,bool>的lambda。

如果您想制作一个新LambdaExpression int并返回bool,您可以收获BodyParameters myFunc对象,像这样:

var b = Expression.Lambda(myFunc.Body, myFunc.Parameters).Compile().DynamicInvoke(5);

或者,由于myFunc已经是LambdaExpression,您可以直接编译它:

var c = myFunc.Compile().DynamicInvoke(6);

Demo.