【问题标题】:Build expression trees to represent if-else构建表达式树来表示 if-else
【发布时间】:2012-09-06 00:21:48
【问题描述】:

在完整的条件表达式上使用 ExpressionSerialization 反序列化表达式树,即三元运算符给出错误。如果我使用三元运算符,则会导致 FullConditionExpression(系统不支持的异常)

使用以下链接中的代码:

http://archive.msdn.microsoft.com/exprserialization

上面的链接有最新版本吗?

http://metalinq.codeplex.com/

后来试过了

public Expression<Func<object, string>> LabelCriteria { get; set; }

LabelCriteria = x =>
    {
      if (true)
          return "Cash";
      else      
          return " ";
    }

表达式不支持 if - else 块。它给出了错误“带有语句体的 lambda 表达式不能转换为表达式树。有没有其他方法可以做到这一点。

【问题讨论】:

  • 它只是一个代码 sn-p。我想实际使用 if else-if else-if else 。

标签: c# expression-trees


【解决方案1】:

你可以使用像这里这样的方法:

string myFunction(Object obj){
     //here your if-else...
}

LabelCriteria = x => myFunction(x);

【讨论】:

    【解决方案2】:

    你必须使用条件运算符:

    LabelCriteria = x => true ? "Cash" : " ";
    

    编译器可能会因为常量折叠而修改表达式,但是,因为条件是常量表达式 (true)。尝试在那里使用一个变量,看看会发生什么。

    【讨论】:

    • True 仅用于代码 sn-p。它基本上检查多个事物以评估为真或假。我还想补充一点,我想使用 if else-if else-if else 循环。
    • @user1650470 你不能在表达式 lambda 中使用 if-else。您可以使用条件运算符。如果您有多个条件,请使用多个条件运算符:x =&gt; condition1 ? result1 : condition2 ? result2 : condition3 ? result3 : result4;。无法将语句 lambda(例如 x =&gt; { if (condition1) return result1; else return result2; })转换为表达式树。
    【解决方案3】:

    您可以使用表达式 API 显式构建表达式树,请参阅 https://msdn.microsoft.com/en-us/library/bb397951.aspx

    这里是你的问题的代码:

            ParameterExpression x = Expression.Parameter(typeof (object), "x");
            ConditionalExpression body = Expression.IfThenElse(
                Expression.Constant(true),
                Expression.Constant("Cash"),
                Expression.Constant(" ")
                );
    
            LabelCriteria = Expression.Lambda<Func<object, string>>(body, x);
    

    【讨论】:

    • 您的代码抛出 'System.ArgumentException:'System.Void' 类型的表达式不能用于返回类型 'System.String'。您应该使用 Expression.Condition 而不是 Expression.IfThenElse。
    【解决方案4】:

    我找到了解决办法。

    我正在使用这段特定的代码

    使用以下链接中的代码:

    http://archive.msdn.microsoft.com/exprserialization

    它不处理完整的条件表达式,但它处理条件表达式。我刚刚在反序列化的开关盒中添加了 FullConditionalExpression 并且它起作用了。和switch中的ConditionalExpression一样。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多