Пример #1
0
        private Expression Build(IcaseFunctionNode node)
        {
            Expression ifFalseExpr   = Expression.Convert(InnerBuild(node.ElseResultNode), typeof(object));
            Expression conditionExpr = null;

            foreach (var caseConditionNode in node.CaseConditionNodes.Reverse())
            {
                var conditionNode = InnerBuild(caseConditionNode.ConditionNode);

                if (conditionNode.NodeType == ExpressionType.Constant && ((ConstantExpression)conditionNode).Value == null)
                {
                    return(Expression.Constant(null));
                }

                var testExpr   = Expression.Convert(conditionNode, typeof(bool));
                var ifTrueExpr = Expression.Convert(InnerBuild(caseConditionNode.ResultNode), typeof(object));
                conditionExpr = Expression.Condition(testExpr, ifTrueExpr, ifFalseExpr, typeof(object));
                ifFalseExpr   = conditionExpr;
            }
            return(conditionExpr);
        }
 //TODO: implement with CSharpExpressionHelperMethodResolver in order to get auto type conversion
 private Type Build(IcaseFunctionNode node)
 {
     // just picked one argument. I'm assuming the others are going to be the same.
     return(InnerBuild(node.CaseConditionNodes.First().ResultNode));
 }