private static ReadOnlyCollection <IInstanceCreator> GetInstanceCreators(Type targetType) { Debug.Assert(targetType != null); Debug.Assert(targetType.IsVisible); // If creators have not been cached, or are in the process of being cached, take lock and re-check cache. ReadOnlyCollection <IInstanceCreator> cached; if (!creatorCache_.TryGetValue(targetType, out cached) || object.ReferenceEquals(cached, TempCreators)) { bool isInstanceCreator = targetType.IsGenericType && targetType.GetGenericTypeDefinition( ) == typeof(IInstanceCreator <>); Type[] availableTypes = isInstanceCreator ? null : TypeLoader.GetUsableTypes(targetType).ToArray( ); lock ( creatorCacheLock_ ) { if (!TypeCreator.creatorCache_.ContainsKey(targetType)) { TypeCreator.creatorCache_[targetType] = TempCreators; ReadOnlyCollection <IInstanceCreator> creators; // If target type is for IInstanceCreator<T>, wrap creators for T. if (isInstanceCreator) { Type innerTargetType = targetType.GetGenericArguments( )[0]; var innerCreators = TypeCreator.GetCreators(innerTargetType); var outerCreators = new IInstanceCreator[innerCreators.Count]; for (int i = 0; i < outerCreators.Length; ++i) { outerCreators[i] = WeakInstanceCreator.ForInstanceCreator(targetType, innerCreators[i]); } creators = outerCreators.ToReadOnlyCollection( ); } // Otherwise, get creators for type directly. else { creators = GetInstanceCreators(targetType, availableTypes); } TypeCreator.creatorCache_[targetType] = creators; } } } return(TypeCreator.creatorCache_[targetType]); }