示例#1
0
        public TypeMap CreateClosedGenericTypeMap(ITypeMapConfiguration openMapConfig, TypeMapRegistry typeMapRegistry, TypePair closedTypes)
        {
            var closedMap = _typeMapFactory.CreateTypeMap(closedTypes.SourceType, closedTypes.DestinationType, this);

            openMapConfig.Configure(closedMap);

            Configure(typeMapRegistry, closedMap);

            if (closedMap.TypeConverterType != null)
            {
                var typeParams =
                    (openMapConfig.SourceType.IsGenericTypeDefinition() ? closedTypes.SourceType.GetGenericArguments() : new Type[0])
                    .Concat
                        (openMapConfig.DestinationType.IsGenericTypeDefinition() ? closedTypes.DestinationType.GetGenericArguments() : new Type[0]);

                var neededParameters = closedMap.TypeConverterType.GetGenericParameters().Length;
                closedMap.TypeConverterType = closedMap.TypeConverterType.MakeGenericType(typeParams.Take(neededParameters).ToArray());
            }
            if (closedMap.DestinationTypeOverride?.IsGenericTypeDefinition() == true)
            {
                var neededParameters = closedMap.DestinationTypeOverride.GetGenericParameters().Length;
                closedMap.DestinationTypeOverride = closedMap.DestinationTypeOverride.MakeGenericType(closedTypes.DestinationType.GetGenericArguments().Take(neededParameters).ToArray());
            }
            return(closedMap);
        }
示例#2
0
 private TypeMap GetCachedMap(TypePair initialTypes, TypePair types) => (types != initialTypes && _typeMapPlanCache.TryGetValue(types, out var typeMap)) ? typeMap : null;
示例#3
0
        public TypeMap FindTypeMapFor(Type sourceType, Type destinationType)
        {
            var typePair = new TypePair(sourceType, destinationType);

            return(FindTypeMapFor(typePair));
        }
示例#4
0
        public LambdaExpression BuildExecutionPlan(Type sourceType, Type destinationType)
        {
            var typePair = new TypePair(sourceType, destinationType);

            return(BuildExecutionPlan(new MapRequest(typePair, typePair)));
        }
示例#5
0
        public TypeMap ResolveTypeMap(Type sourceType, Type destinationType, ITypeMapConfiguration inlineConfiguration)
        {
            var typePair = new TypePair(sourceType, destinationType);

            return(ResolveTypeMap(typePair, inlineConfiguration));
        }
示例#6
0
 public ResolutionContext(object source, object destination, TypePair types, ResolutionContext parent) : this(parent)
 {
     SourceValue      = source;
     DestinationValue = destination;
     Types            = types;
 }
示例#7
0
 internal void DecrementTypeDepth(TypePair types)
 {
     TypeDepth[types]--;
 }
示例#8
0
 public ValidationContext(TypePair types, PropertyMap propertyMap, IObjectMapper objectMapper) : this(types, propertyMap, objectMapper, null)
 {
 }
示例#9
0
 public ValidationContext(TypePair types, PropertyMap propertyMap, TypeMap typeMap) : this(types, propertyMap, null, typeMap)
 {
 }
示例#10
0
        public TypeMap CreateClosedGenericTypeMap(ITypeMapConfiguration openMapConfig, TypePair closedTypes, IConfigurationProvider configurationProvider)
        {
            var closedMap = TypeMapFactory.CreateTypeMap(closedTypes.SourceType, closedTypes.DestinationType, this);

            closedMap.IsClosedGeneric = true;
            openMapConfig.Configure(closedMap);

            Configure(closedMap, configurationProvider);

            if (closedMap.TypeConverterType != null)
            {
                var typeParams =
                    (openMapConfig.SourceType.IsGenericTypeDefinition ? closedTypes.SourceType.GetGenericArguments() : Type.EmptyTypes)
                    .Concat
                        (openMapConfig.DestinationType.IsGenericTypeDefinition ? closedTypes.DestinationType.GetGenericArguments() : Type.EmptyTypes);

                var neededParameters = closedMap.TypeConverterType.GetGenericParameters().Length;
                closedMap.TypeConverterType = closedMap.TypeConverterType.MakeGenericType(typeParams.Take(neededParameters).ToArray());
            }
            if (closedMap.DestinationTypeOverride?.IsGenericTypeDefinition == true)
            {
                var neededParameters = closedMap.DestinationTypeOverride.GetGenericParameters().Length;
                closedMap.DestinationTypeOverride = closedMap.DestinationTypeOverride.MakeGenericType(closedTypes.DestinationType.GetGenericArguments().Take(neededParameters).ToArray());
            }
            return(closedMap);
        }
示例#11
0
        private static LambdaExpression TryCatch(LambdaExpression mapExpression, ParameterExpression source, ParameterExpression destination, ParameterExpression context, TypePair types)
        {
            var exception = Parameter(typeof(Exception), "ex");

            return(Lambda(Expression.TryCatch(mapExpression.Body,
                                              MakeCatchBlock(typeof(Exception), exception, Block(
                                                                 Throw(New(ExceptionConstructor, Constant("Error mapping types."), exception, Constant(types))),
                                                                 Default(destination.Type)), null)),
                          source, destination, context));
        }
示例#12
0
 public MapRequest(TypePair requestedTypes, TypePair runtimeTypes)
 {
     RequestedTypes = requestedTypes;
     RuntimeTypes   = runtimeTypes;
     _hashcode      = unchecked (RequestedTypes.GetHashCode() * 397) ^ RuntimeTypes.GetHashCode();
 }
示例#13
0
 public bool IsConventionMap(TypePair types) => TypeConfigurations.Any(c => c.IsMatch(types));
示例#14
0
        private void Seal(IConfiguration configuration)
        {
            ServiceCtor = configuration.ServiceCtor;
            AllowNullDestinationValues = configuration.AllowNullDestinationValues;
            AllowNullCollections       = configuration.AllowNullCollections;

            var derivedMaps     = new List <Tuple <TypePair, TypeMap> >();
            var redirectedTypes = new List <Tuple <TypePair, TypePair> >();

            foreach (var profile in configuration.Profiles.Cast <IProfileConfiguration>())
            {
                profile.Register(_typeMapRegistry);
            }

            foreach (var action in configuration.AllTypeMapActions)
            {
                foreach (var typeMap in _typeMapRegistry.TypeMaps)
                {
                    var expression = new MappingExpression(typeMap.Types, typeMap.ConfiguredMemberList);

                    action(typeMap, expression);

                    expression.Configure(typeMap.Profile, typeMap);
                }
            }

            foreach (var action in configuration.AllPropertyMapActions)
            {
                foreach (var typeMap in _typeMapRegistry.TypeMaps)
                {
                    foreach (var propertyMap in typeMap.GetPropertyMaps())
                    {
                        var memberExpression = new MappingExpression.MemberConfigurationExpression(propertyMap.DestinationProperty, typeMap.SourceType);

                        action(propertyMap, memberExpression);

                        memberExpression.Configure(typeMap);
                    }
                }
            }

            foreach (var profile in configuration.Profiles.Cast <IProfileConfiguration>())
            {
                profile.Configure(_typeMapRegistry);
            }

            foreach (var typeMap in _typeMapRegistry.TypeMaps)
            {
                _typeMapPlanCache[typeMap.Types] = typeMap;

                if (typeMap.DestinationTypeOverride != null)
                {
                    redirectedTypes.Add(Tuple.Create(typeMap.Types, new TypePair(typeMap.SourceType, typeMap.DestinationTypeOverride)));
                }
                if (typeMap.SourceType.IsNullableType())
                {
                    var nonNullableTypes = new TypePair(Nullable.GetUnderlyingType(typeMap.SourceType), typeMap.DestinationType);
                    redirectedTypes.Add(Tuple.Create(nonNullableTypes, typeMap.Types));
                }
                derivedMaps.AddRange(GetDerivedTypeMaps(typeMap).Select(derivedMap => Tuple.Create(new TypePair(derivedMap.SourceType, typeMap.DestinationType), derivedMap)));
            }
            foreach (var redirectedType in redirectedTypes)
            {
                var derivedMap = FindTypeMapFor(redirectedType.Item2);
                if (derivedMap != null)
                {
                    _typeMapPlanCache[redirectedType.Item1] = derivedMap;
                }
            }
            foreach (var derivedMap in derivedMaps.Where(derivedMap => !_typeMapPlanCache.ContainsKey(derivedMap.Item1)))
            {
                _typeMapPlanCache[derivedMap.Item1] = derivedMap.Item2;
            }

            foreach (var typeMap in _typeMapRegistry.TypeMaps)
            {
                typeMap.Seal(_typeMapRegistry, this);
            }
        }
 public TypeMapConfigErrors(TypePair types, string[] profileNames)
 {
     Types        = types;
     ProfileNames = profileNames;
 }
示例#16
0
        public Func <TSource, TDestination, ResolutionContext, TDestination> GetMapperFunc <TSource, TDestination>(TypePair types)
        {
            var key        = new TypePair(typeof(TSource), typeof(TDestination));
            var mapRequest = new MapRequest(key, types);

            return((Func <TSource, TDestination, ResolutionContext, TDestination>)GetMapperFunc(mapRequest));
        }
示例#17
0
 public MapRequest(TypePair requestedTypes, TypePair runtimeTypes, IMemberMap memberMap = null)
 {
     RequestedTypes = requestedTypes;
     RuntimeTypes   = runtimeTypes;
     MemberMap      = memberMap;
 }
示例#18
0
 public TypeMap FindTypeMapFor(TypePair typePair) => _typeMapRegistry.GetTypeMap(typePair);
示例#19
0
 internal void IncrementTypeDepth(TypePair types)
 {
     TypeDepth[types]++;
 }
示例#20
0
        public TypeMap ResolveTypeMap(TypePair typePair)
        {
            var typeMap = _typeMapPlanCache.GetOrAdd(typePair, _getTypeMap);

            return(typeMap);
        }
示例#21
0
 public bool TypeHasBeenIncluded(TypePair derivedTypes) => _includedDerivedTypes.Contains(derivedTypes);
示例#22
0
 private bool CoveredByObjectMap(TypePair typePair)
 {
     return(GetMappers().FirstOrDefault(m => m.IsMatch(typePair)) != null);
 }
示例#23
0
 public TypeMap FindTypeMapFor(TypePair typePair) => _typeMapRegistry.GetOrDefault(typePair);
示例#24
0
 public MapRequest(TypePair requestedTypes, TypePair runtimeTypes)
 {
     RequestedTypes = requestedTypes;
     RuntimeTypes   = runtimeTypes;
 }
示例#25
0
 public TypeMap ResolveTypeMap(TypePair typePair)
 => ResolveTypeMap(typePair, new DefaultTypeMapConfig(typePair));
示例#26
0
 internal int GetTypeDepth(TypePair types) => TypeDepth.TryGetValue(types, out int depth) ? depth : TypeDepth[types] = 1;
示例#27
0
 public bool TypeHasBeenIncluded(TypePair derivedTypes)
 {
     return(_includedDerivedTypes.Contains(derivedTypes));
 }
示例#28
0
        public TypeMap FindTypeMapFor(object source, Type sourceType, Type destinationType)
        {
            var typeMapPair = new TypePair(sourceType, destinationType);

            TypeMap typeMap;

            if (!_typeMapCache.TryGetValue(typeMapPair, out typeMap))
            {
                // Cache miss
                typeMap = FindTypeMap(source, sourceType, destinationType, DefaultProfileName);

                //We don't want to inherit base mappings which may be ambiguous or too specific resulting in cast exceptions
                if (source == null || source.GetType() == sourceType)
                {
                    _typeMapCache[typeMapPair] = typeMap;
                }
            }
            // Due to the inheritance we can have derrived mapping cached which is not valid for this source object
            else if (source != null && typeMap != null && !typeMap.SourceType.IsAssignableFrom(source.GetType()))
            {
                typeMap = FindTypeMapFor(source, source.GetType(), destinationType);
            }

            if (typeMap != null && typeMap.DestinationTypeOverride != null)
            {
                return(FindTypeMapFor(source, sourceType, typeMap.DestinationTypeOverride));
            }
            // Check for runtime derived types
            var shouldCheckDerivedType = (typeMap != null) && (typeMap.HasDerivedTypesToInclude()) && (source != null) && (source.GetType() != sourceType);

            if (shouldCheckDerivedType)
            {
                var potentialSourceType = source.GetType();
                //Try and get the most specific type map possible
                var potentialTypes = _typeMaps
                                     .Where(t =>
                {
                    return(destinationType.IsAssignableFrom(t.DestinationType) &&
                           t.SourceType.IsAssignableFrom(source.GetType()) &&
                           (
                               destinationType.IsAssignableFrom(t.DestinationType) ||
                               t.GetDerivedTypeFor(potentialSourceType) != null
                           )
                           );
                }
                                            );

                var potentialDestTypeMap =
                    potentialTypes
                    .OrderByDescending(t => GetInheritanceDepth(t.DestinationType))
                    .FirstOrDefault();
                var ambiguousPotentialTypes = potentialTypes
                                              .Where(t => t.DestinationType == potentialDestTypeMap.DestinationType)
                                              .ToList();

                if (ambiguousPotentialTypes.Count > 1)
                {
                    potentialDestTypeMap = ambiguousPotentialTypes
                                           .OrderByDescending(t => GetInheritanceDepth(t.SourceType))
                                           .FirstOrDefault();
                }

                if (potentialDestTypeMap == typeMap)
                {
                    return(typeMap);
                }

                var targetDestinationType = potentialDestTypeMap.DestinationType;
                var potentialTypeMap      = FindExplicitlyDefinedTypeMap(potentialSourceType, targetDestinationType);
                if (potentialTypeMap == null)
                {
                    var targetSourceType = targetDestinationType != destinationType ? potentialSourceType : typeMap.SourceType;
                    typeMap = FindTypeMap(source, targetSourceType, targetDestinationType, DefaultProfileName);
                }
                else
                {
                    typeMap = potentialTypeMap;
                }
            }

            return(typeMap);
        }
示例#29
0
        public TypeMap ResolveTypeMap(Type sourceType, Type destinationType)
        {
            var typePair = new TypePair(sourceType, destinationType);

            return(ResolveTypeMap(typePair));
        }
示例#30
0
 public MapRequest(TypePair requestedTypes, TypePair runtimeTypes, PropertyMap propertyMap = null)
     : this(requestedTypes, runtimeTypes, new MapperConfiguration.DefaultTypeMapConfig(requestedTypes), propertyMap)
 {
 }