public Type GetType(string name, bool throwOnError, bool ignoreCase) { TypeNameParser parser = TypeNameParser.Parse(name, throwOnError); if (parser.Error) { return(null); } if (parser.AssemblyName != null) { if (throwOnError) { throw new ArgumentException("Type names passed to Assembly.GetType() must not specify an assembly."); } else { return(null); } } TypeName typeName = TypeName.Split(TypeNameParser.Unescape(parser.FirstNamePart)); Type type = ignoreCase ? FindTypeIgnoreCase(typeName.ToLowerInvariant()) : FindType(typeName); if (type == null && __IsMissing) { throw new MissingAssemblyException((MissingAssembly)this); } return(parser.Expand(type, this.ManifestModule, throwOnError, name, false, ignoreCase)); }
internal Type Expand(Type type, Module context, bool throwOnError, string originalName, bool resolve, bool ignoreCase) { Debug.Assert(!resolve || !ignoreCase); if (type == null) { if (throwOnError) { throw new TypeLoadException(originalName); } return(null); } if (nested != null) { Type outer; foreach (string nest in nested) { outer = type; TypeName name = TypeName.Split(TypeNameParser.Unescape(nest)); type = ignoreCase ? outer.FindNestedTypeIgnoreCase(name.ToLowerInvariant()) : outer.FindNestedType(name); if (type == null) { if (resolve) { type = outer.Module.universe.GetMissingTypeOrThrow(context, outer.Module, outer, name); } else if (throwOnError) { throw new TypeLoadException(originalName); } else { return(null); } } } } if (genericParameters != null) { Type[] typeArgs = new Type[genericParameters.Length]; for (int i = 0; i < typeArgs.Length; i++) { typeArgs[i] = genericParameters[i].GetType(type.Assembly.universe, context, throwOnError, originalName, resolve, ignoreCase); if (typeArgs[i] == null) { return(null); } } type = type.MakeGenericType(typeArgs); } if (modifiers != null) { foreach (short modifier in modifiers) { switch (modifier) { case SZARRAY: type = type.MakeArrayType(); break; case BYREF: type = type.MakeByRefType(); break; case POINTER: type = type.MakePointerType(); break; default: type = type.MakeArrayType(modifier); break; } } } return(type); }