Example #1
0
 public void ProcessStep <TBuilder>(IMappingConfigStep step, TBuilder builder, IMappingConfiguration currentMappingConfiguration, IMappingConfiguration previousMappingConfiguration)
 {
     if (!specificHandlers.Any(h => h.TryProcessStep(step, builder, currentMappingConfiguration, previousMappingConfiguration)))
     {
         throw new Exception($"No handler was found to process step {step?.GetType().Name}.");
     }
 }
        public bool TryProcessStep <TBuilder>(IMappingConfigStep step, TBuilder builder, IMappingConfiguration currentMappingConfiguration, IMappingConfiguration previousMappingConfiguration)
        {
            if (!(step is ResolveExtraParameterStep resolveExtraParameterStep))
            {
                return(false);
            }
            var methodParameters = resolveExtraParameterStep.ResolveParameterExpression.Parameters
                                   .Select(p => Expression.Parameter(p.Type, p.Name))
                                   .ToList();
            var methodActions = new List <Expression>
            {
                Expression.Constant(ResolveExtraParameterExpressionMarkers.ResolveExtraParameterCall)
            };
            var builderParameter = Expression.Parameter(typeof(TBuilder));
            var newParameter     = Expression.Variable(resolveExtraParameterStep.ResolveParameterExpression.ReturnType);
            var staticResolveParameterExpression = MakeExpressionStatic(resolveExtraParameterStep.ResolveParameterExpression, builder);
            var newParameterResolveCall          = Expression.Invoke(staticResolveParameterExpression, methodParameters.With(builderParameter));
            var newParameterAssign = Expression.Assign(newParameter, newParameterResolveCall);

            methodActions.Add(newParameterAssign);
            var result = Expression.Variable(resolveExtraParameterStep.NextStepConvertMethod.ReturnType);
            var callNextStepConvert = Expression.Call(null, resolveExtraParameterStep.NextStepConvertMethod,
                                                      methodParameters
                                                      .WithBefore <Expression>(Expression.Constant(previousMappingConfiguration))
                                                      .With(newParameter)
                                                      .With(builderParameter));

            var assignResult = Expression.Assign(result, callNextStepConvert);

            methodActions.Add(Expression.Constant(ResolveExtraParameterExpressionMarkers.ConvertNextStepCall));
            methodActions.Add(assignResult);
            var callNextStepMapData = Expression.Call(null, resolveExtraParameterStep.NextStepMapMethod,
                                                      methodParameters
                                                      .WithBefore <Expression>(Expression.Constant(previousMappingConfiguration))
                                                      .With(newParameter)
                                                      .With(builderParameter)
                                                      .With(result));

            methodActions.Add(Expression.Constant(ResolveExtraParameterExpressionMarkers.MapNextStepCall));
            methodActions.Add(callNextStepMapData);
            methodActions.Add(result);
            var methodBody    = Expression.Block(new[] { newParameter, result }, methodActions);
            var mapExpression = Expression.Lambda(methodBody, methodParameters.With(builderParameter));

            resolveExtraParameterStep.ServiceRegistrationHelper.RegisterService <IMappingExpressionAutocompleteService>(r => new ResolveExtraParameterMappingExpressionAutocompleteService());
            resolveExtraParameterStep.CreateMappingMethod.Invoke(null, new object[]
            {
                currentMappingConfiguration,
                mapExpression,
                resolveExtraParameterStep.ServiceRegistrationHelper.GetInitializationDelegate()
            });
            return(true);
        }
        public bool TryProcessStep <TBuilder>(IMappingConfigStep step, TBuilder builder, IMappingConfiguration currentMappingConfiguration, IMappingConfiguration previousMappingConfiguration)
        {
            var resultMappingConfigStep = step as ResultMappingConfigStep;

            if (resultMappingConfigStep == null)
            {
                return(false);
            }
            var staticResultExpression = MakeExpressionStatic(resultMappingConfigStep.ResultExpression, builder);

            resultMappingConfigStep.CreateMappingMethod.Invoke(null, new object[]
            {
                currentMappingConfiguration,
                staticResultExpression,
                resultMappingConfigStep.SettingsInitializeDelegate
            });
            return(true);
        }