gpt4 book ai didi

c# - 带返回值的动态 Linq 表达式

转载 作者:可可西里 更新时间:2023-11-01 08:38:48 26 4
gpt4 key购买 nike

我需要创建一个动态 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:

Cannot jump to the label "label"`

怎么了?我只需要返回 true 或 false。

最佳答案

您需要更改一些内容:

  • 按照 René 的建议,将返回标签放在 block 表达式中的函数底部。这是你的 return语句会跳转。

  • 将 Lambda 声明为类型 Func<int, bool> .由于您需要返回值,因此这需要是一个函数,而不是一个 Action 。

  • 声明 returnTarget标签类型 bool .由于 block 表达式的返回值是其最后一条语句的值,因此标签的类型必须正确。

  • 为最终标签提供默认值(= 如果通过正常控制流而不是 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"

关于c# - 带返回值的动态 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com