我需要创建一个动态 linq 表达式,然后我开始使用许多示例。我测试了一些工作,有些没有。在这种情况下,我想创建一个如下所示的方法:
public bool Check(int intvar)
{
if ( i > 2 )
return true;
else
return false;
}
现在我写了以下内容:
LabelTarget returnTarget = Expression.Label("label");
ParameterExpression para = Expression.Parameter(typeof(int), "intvalue");
Expression test = Expression.GreaterThan(para, Expression.Constant(5));
Expression iftrue = Expression.Return(returnTarget, Expression.Constant(true));
Expression iffalse = Expression.Return(returnTarget, Expression.Constant(false));
Expression.IfThenElse(test, iftrue, iffalse);
this.TheExpression = Expression.IfThenElse(test, iftrue, iffalse);
Expression.Lambda<Action<int>>(
this.TheExpression,
new ParameterExpression[] { para }
).Compile()(5);
现在它抛出InvalidOperationException
:
无法跳转到标签“label”`
怎么了 ?我只需要返回 true 或 false。
你需要改变一些事情:
正如 René 建议的那样,将返回标签放在块表达式中的函数底部。这就是你的return
语句会跳转。
将 Lambda 声明为类型Func<int, bool>
。由于您想要一个返回值,因此这需要是一个函数,而不是一个操作。
声明returnTarget
标签为类型bool
。由于块表达式的返回值是其最后一条语句的值,因此标签必须是正确的类型。
-
为最终标签提供默认值(= 如果通过正常控制流而不是通过普通控制流到达标签,则为函数的返回值)return
陈述)。
LabelTarget returnTarget = Expression.Label(typeof(bool));
ParameterExpression para = Expression.Parameter(typeof(int), "intvalue");
Expression test = Expression.GreaterThan(para, Expression.Constant(5));
Expression iftrue = Expression.Return(returnTarget, Expression.Constant(true));
Expression iffalse = Expression.Return(returnTarget, Expression.Constant(false));
var ex = Expression.Block(
Expression.IfThenElse(test, iftrue, iffalse),
Expression.Label(returnTarget, Expression.Constant(false)));
var compiled = Expression.Lambda<Func<int, bool>>(
ex,
new ParameterExpression[] { para }
).Compile();
Console.WriteLine(compiled(5)); // prints "False"
Console.WriteLine(compiled(6)); // prints "True"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)