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