public LambdaExpression BuildExecutionPlan(MapRequest mapRequest) { var typeMap = ResolveTypeMap(mapRequest.RuntimeTypes) ?? ResolveTypeMap(mapRequest.RequestedTypes); if (typeMap != null) { return(GenerateTypeMapExpression(mapRequest, typeMap)); } var mapperToUse = FindMapper(mapRequest.RuntimeTypes); LambdaExpression result = GenerateObjectMapperExpression(mapRequest, mapperToUse, this); DebugHelpers.LogExpression(result, "ExecutionPlan"); return(result); }
private static Expression <UntypedMapperFunc> Wrap(MapRequest mapRequest, LambdaExpression typedExpression) { DebugHelpers.LogExpression(typedExpression, "typed expression"); var sourceParameter = Parameter(typeof(object), "source"); var destinationParameter = Parameter(typeof(object), "destination"); var contextParameter = Parameter(typeof(ResolutionContext), "context"); var requestedSourceType = mapRequest.RequestedTypes.SourceType; var requestedDestinationType = mapRequest.RequestedTypes.DestinationType; var destination = requestedDestinationType.IsValueType() ? Coalesce(destinationParameter, New(requestedDestinationType)) : (Expression)destinationParameter; // Invoking a delegate here return(Lambda <UntypedMapperFunc>( ToType( Invoke(typedExpression, ToType(sourceParameter, requestedSourceType), ToType(destination, requestedDestinationType), contextParameter) , typeof(object)), sourceParameter, destinationParameter, contextParameter)); }
public void Seal(IConfigurationProvider configurationProvider, Stack <TypeMap> typeMapsPath = null) { if (_sealed) { return; } _sealed = true; foreach (var inheritedTypeMap in _inheritedTypeMaps) { ApplyInheritedTypeMap(inheritedTypeMap); } _orderedPropertyMaps = _propertyMaps .Union(_inheritedMaps) .OrderBy(map => map.MappingOrder).ToArray(); MapExpression = new TypeMapPlanBuilder(configurationProvider, this).CreateMapperLambda(typeMapsPath); DebugHelpers.LogExpression(MapExpression, "MapExpression"); }