private Type GenericPathType(Type declaringType, Type definitionType, TypeDefinition definition, TypeReference reference, GenericScope genericScope) { var generic = reference as GenericInstanceType; var arguments = generic != null ? new Type[generic.GenericArguments.Count] : System.Type.EmptyTypes; var allArgumentsAreRuntime = true; if (generic != null) { for (var i = 0; i < generic.GenericArguments.Count; i++) { var resolved = Type(generic.GenericArguments[i], genericScope); allArgumentsAreRuntime = allArgumentsAreRuntime && TypeSupport.IsRuntime(resolved); arguments[i] = resolved; } } var cacheKey = new GenericTypeKey(declaringType, definitionType, arguments); Type cached; if (_genericTypeCache.TryGetValue(cacheKey, out cached)) { return(cached); } var resultType = GenericPathTypeUncached(declaringType, definitionType, definition, arguments, allArgumentsAreRuntime, genericScope); _genericTypeCache.Add(cacheKey, resultType); return(GenericPathType(declaringType, definitionType, definition, arguments, allArgumentsAreRuntime, genericScope)); }
private Type GenericPathType(Type declaringType, Type definitionType, TypeDefinition definition, Type[] arguments, bool allArgumentsAreRuntime, GenericScope genericScope) { var cacheKey = new GenericTypeKey(declaringType, definitionType, arguments); Type cached; if (_genericTypeCache.TryGetValue(cacheKey, out cached)) { return(cached); } var resultType = GenericPathTypeUncached(declaringType, definitionType, definition, arguments, allArgumentsAreRuntime, genericScope); _genericTypeCache.Add(cacheKey, resultType); return(resultType); }