构建表达式树来表示if-else

时间:2012-09-06 00:21:49

标签: c# expression-trees

在完整条件表达式上使用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表达式无法转换为表达式树。还有其他方法可以做到。

4 个答案:

答案 0 :(得分:5)

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

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

LabelCriteria = x => myFunction(x);

答案 1 :(得分:4)

您必须使用条件运算符:

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

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

答案 2 :(得分:1)

您可以使用Expression 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);

答案 3 :(得分:0)

我找到了解决方案。

Ad我正在使用这段特殊的代码

使用以下链接中的代码:

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

它没有处理完整的条件表达式,但它处理条件表达式。我刚刚在反序列化中将FullConditionalExpression添加到switch case中并且它工作正常。它与交换机中的ConditionalExpression相同。