public ProcessingResult ProcessExpression(Expression expression, List <NodeReference> references, DataContext context)
        {
            var memberInitExpression = expression as MemberInitExpression;

            if (memberInitExpression == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var instanceResult = ExpressionProcessingHelper.ProcessExpression(memberInitExpression.NewExpression, references, context);

            if (!instanceResult.IsSuccess)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var evaluatedBindings = MemberBindingEvaluator.EvaluateBindings(memberInitExpression.Bindings.ToList(), references, context);

            if (evaluatedBindings.Any(b => !b.IsSuccess))
            {
                return(ProcessingResult.Unsuccessful);
            }

            if (instanceResult.IsSingleItem && evaluatedBindings.Any(b => !b.IsSingle))
            {
                instanceResult = ExpressionProcessingHelper.CopyInstances(instanceResult, references.Count,
                                                                          () => ExpressionProcessingHelper.ProcessExpression(memberInitExpression.NewExpression, references, context).Result);
            }

            return(MemberBindingProcessingHelper.ProcessBindings(evaluatedBindings, instanceResult));
        }
Exemplo n.º 2
0
        public ProcessingResult ProcessExpression(Expression expression, List <NodeReference> references, DataContext context)
        {
            var listInitExpression = expression as ListInitExpression;

            if (listInitExpression == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var instanceResult = ExpressionProcessingHelper.ProcessExpression(listInitExpression.NewExpression, references, context);

            if (instanceResult == null)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var evaluatedInitializers = EvaluateInitializers(listInitExpression.Initializers, references, context);

            var isSuccess = evaluatedInitializers.All(i => i.Arguments.All(a => a.IsSuccess));

            if (!isSuccess)
            {
                return(ProcessingResult.Unsuccessful);
            }

            var isSingleInitializers = evaluatedInitializers.All(i => i.Arguments.All(a => a.IsSingleItem));

            if (instanceResult.IsSingleItem && !isSingleInitializers)
            {
                instanceResult = ExpressionProcessingHelper.CopyInstances(instanceResult, references.Count,
                                                                          () => ExpressionProcessingHelper.ProcessExpression(listInitExpression.NewExpression, references, context).Result);
            }

            instanceResult = evaluatedInitializers.Aggregate(instanceResult,
                                                             (current, initializer) => MemberBindingProcessingHelper.ProcessListInitializer(initializer, current));

            return(instanceResult);
        }