【问题标题】:Stuck on simple single param lambda with bool return value停留在具有布尔返回值的简单单参数 lambda
【发布时间】:2016-06-12 09:37:53
【问题描述】:

我被困在一个只有一个 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”

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

【问题讨论】:

  • 你想用表达式去哪里?对于函数本身Func&lt;int, bool&gt; myFunc = x =&gt; x == 5; 就可以了。见 here 包括 cmets!
  • @TaW 我正在从另一个我无法控制的库中获取表达式,所以很遗憾这不是我的选择。

标签: c# lambda


【解决方案1】:

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

如果你想创建一个新的LambdaExpression,它接受int 并返回bool,你可以收获myFunc 对象的BodyParameters,如下所示:

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

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

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

Demo.

【讨论】:

  • 如果myFunc 是强类型(如问题Expression&lt;Func&lt;int, bool&gt;&gt;),则在最后一个示例中不需要DynamicInvoke。你可以做var c = myFunc.Compile()(6);
猜你喜欢
  • 2011-12-14
  • 2019-05-24
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多