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);
        }