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));
        }
示例#2
0
        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);
        }