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 GenericPathTypeUncached(Type declaringType, Type definitionType, TypeDefinition definition, Type[] arguments, bool allArgumentsAreRuntime, GenericScope genericScope) { if (!TypeSupport.IsRuntime(definitionType)) { return(NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope)); } if (arguments.Length == 0) { return(declaringType.GetNestedType(definitionType.Name)); } if (allArgumentsAreRuntime) { return(definitionType.MakeGenericType(arguments)); } return(NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope)); //var erased = new Type[arguments.Length]; //for (var i = 0; i < arguments.Length; i++) { // erased[i] = TypeSupport.IsRuntime(arguments[i]) ? arguments[i] : typeof(CilinObject); //} //var erasedFull = definitionType.MakeGenericType(erased); //return new ErasedWrapperType(erasedFull, NewInterpretedGenericPathType(declaringType, definitionType, definition, arguments, genericScope)); }
private Type ArrayTypeUncached(Type elementType, GenericScope genericScope) { if (TypeSupport.IsRuntime(elementType)) { return(elementType.MakeArrayType()); } return /*new ErasedWrapperType( * typeof(CilinObject).MakeArrayType(),*/ (NewIntepretedArrayType((NonRuntimeType)elementType, genericScope) /*)*/); }