Example #1
0
        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);
                }
            }
        }