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)); }
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); }