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