public static Expression MapExpression(this IGlobalConfiguration configurationProvider, ProfileMap profileMap, TypePair typePair, Expression sourceParameter, MemberMap propertyMap = null, Expression destinationParameter = null) { destinationParameter ??= Default(typePair.DestinationType); var typeMap = configurationProvider.ResolveTypeMap(typePair); Expression mapExpression = null; bool hasTypeConverter; if (typeMap != null) { hasTypeConverter = typeMap.HasTypeConverter; if (!typeMap.HasDerivedTypesToInclude) { typeMap.Seal(configurationProvider); mapExpression = typeMap.MapExpression?.ConvertReplaceParameters(sourceParameter, destinationParameter); } } else { hasTypeConverter = false; var mapper = configurationProvider.FindMapper(typePair); mapExpression = mapper?.MapExpression(configurationProvider, profileMap, propertyMap, sourceParameter, destinationParameter); } mapExpression ??= ContextMap(typePair, sourceParameter, destinationParameter, propertyMap); if (!hasTypeConverter) { mapExpression = NullCheckSource(profileMap, sourceParameter, destinationParameter, mapExpression, propertyMap); } return(ToType(mapExpression, typePair.DestinationType)); }
private void DryRunTypeMap( ICollection <TypeMap> typeMapsChecked, TypePair types, TypeMap typeMap, MemberMap memberMap ) { if (typeMap == null) { if ( types.SourceType.ContainsGenericParameters || types.DestinationType.ContainsGenericParameters ) { return; } typeMap = _config.ResolveTypeMap(types.SourceType, types.DestinationType); } if (typeMap != null) { if (typeMapsChecked.Contains(typeMap)) { return; } typeMapsChecked.Add(typeMap); var context = new ValidationContext(types, memberMap, typeMap); Validate(context); if (!typeMap.ShouldCheckForValid) { return; } CheckPropertyMaps(typeMapsChecked, typeMap); typeMap.IsValid = true; } else { var mapperToUse = _config.FindMapper(types); if (mapperToUse == null) { throw new AutoMapperConfigurationException(memberMap.TypeMap.Types) { MemberMap = memberMap }; } var context = new ValidationContext(types, memberMap, mapperToUse); Validate(context); if (mapperToUse is IObjectMapperInfo mapperInfo) { var newTypePair = mapperInfo.GetAssociatedTypes(types); DryRunTypeMap(typeMapsChecked, newTypePair, null, memberMap); } } }