我坚持使用单个int参数和bool返回值的lambda:
Expression<Func<int, bool>> myFunc = x => x == 5;
首先,我尝试了这个返回一个我无法理解的新Func;我期待一个真正的布尔值:
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 : Expression of type
‘System.Func`2[System.Int32,System.Boolean]’ cannot be used for return
type ‘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 : Expression of type
‘System.Func`2[System.Int32,System.Boolean]’ cannot be used for return
type ‘System.Boolean’
知道我在这里做错了什么吗?
最佳答案 动态调用代码中的错误是构造lambda的方式.当你将myFunc作为表达式传递时,你得到一个返回Func< int,bool>的lambda.
如果你想创建一个新的LambdaExpression,它接受int并返回bool,你可以收集myFunc对象的Body和Parameters,如下所示:
var b = Expression.Lambda(myFunc.Body, myFunc.Parameters).Compile().DynamicInvoke(5);
或者,由于myFunc已经是LambdaExpression,您可以直接编译它:
var c = myFunc.Compile().DynamicInvoke(6);