private TypeMap FindClosedGenericTypeMapFor(TypePair typePair)
        {
            var genericTypePair = typePair.GetOpenGenericTypePair();

            if (genericTypePair == null)
            {
                return(null);
            }
            ITypeMapConfiguration genericMap;
            ProfileMap            profile;
            TypeMap cachedMap = null;
            var     userMap   = FindTypeMapFor(genericTypePair.Value);

            if (userMap?.DestinationTypeOverride != null)
            {
                genericTypePair = new TypePair(genericTypePair.Value.SourceType, userMap.DestinationTypeOverride).GetOpenGenericTypePair();
                if (genericTypePair == null)
                {
                    return(null);
                }
                userMap = null;
            }
            if (userMap == null && (cachedMap = GetCachedMap(genericTypePair.Value)) != null)
            {
                if (!cachedMap.Types.IsGeneric)
                {
                    return(cachedMap);
                }
                genericMap = cachedMap.Profile.GetGenericMap(cachedMap.Types);
                profile    = cachedMap.Profile;
                typePair   = cachedMap.Types.CloseGenericTypes(typePair);
            }
            else if (userMap == null)
            {
                var item = Profiles
                           .Select(p => new { GenericMap = p.GetGenericMap(typePair), Profile = p })
                           .FirstOrDefault(p => p.GenericMap != null);
                genericMap = item?.GenericMap;
                profile    = item?.Profile;
            }
            else
            {
                genericMap = userMap.Profile.GetGenericMap(typePair);
                profile    = userMap.Profile;
            }
            if (genericMap == null)
            {
                return(null);
            }
            TypeMap typeMap;

            lock (this)
            {
                typeMap = profile.CreateClosedGenericTypeMap(genericMap, typePair, this);
            }
            cachedMap?.CopyInheritedMapsTo(typeMap);
            return(typeMap);
        }
Example #2
0
        private TypeMap FindClosedGenericTypeMapFor(TypePair typePair, TypePair requestedTypes)
        {
            if (typePair.GetOpenGenericTypePair() == null)
            {
                return(null);
            }

            var typeMap = Profiles
                          .Select(p => p.ConfigureClosedGenericTypeMap(_typeMapRegistry, typePair, requestedTypes))
                          .FirstOrDefault(t => t != null);

            typeMap?.Seal(_typeMapRegistry, this);

            return(typeMap);
        }
        private TypeMap FindClosedGenericTypeMapFor(TypePair typePair)
        {
            if (typePair.GetOpenGenericTypePair() == null)
            {
                return(null);
            }
            var mapInfo = Profiles.Select(p => new { GenericMap = p.GetGenericMap(typePair), Profile = p }).FirstOrDefault(p => p.GenericMap != null);

            if (mapInfo == null)
            {
                return(null);
            }
            TypeMap typeMap;

            lock (this)
            {
                typeMap = mapInfo.Profile.CreateClosedGenericTypeMap(mapInfo.GenericMap, _typeMapRegistry, typePair);
            }
            return(typeMap);
        }