Exemple #1
0
        public Type GetType(string className, bool throwOnError, bool ignoreCase)
        {
            TypeNameParser parser = TypeNameParser.Parse(className, throwOnError);

            if (parser.Error)
            {
                return(null);
            }
            if (parser.AssemblyName != null)
            {
                if (throwOnError)
                {
                    throw new ArgumentException("Type names passed to Module.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 MissingModuleException((MissingModule)this);
            }
            return(parser.Expand(type, this, throwOnError, className, false, ignoreCase));
        }
Exemple #2
0
        public Type GetType(string className, bool throwOnError, bool ignoreCase)
        {
            if (ignoreCase)
            {
                throw new NotImplementedException();
            }
            TypeNameParser parser = TypeNameParser.Parse(className, throwOnError);

            if (parser.Error)
            {
                return(null);
            }
            if (parser.AssemblyName != null)
            {
                if (throwOnError)
                {
                    throw new ArgumentException("Type names passed to Module.GetType() must not specify an assembly.");
                }
                else
                {
                    return(null);
                }
            }
            Type type = FindType(TypeName.Split(TypeNameParser.Unescape(parser.FirstNamePart)));

            if (type == null && __IsMissing)
            {
                throw new MissingModuleException((MissingModule)this);
            }
            return(parser.Expand(type, this.Assembly, throwOnError, className));
        }
Exemple #3
0
        internal Type GetTypeImpl(string typeName)
        {
            Type type = FindType(TypeName.Split(TypeNameParser.Unescape(typeName)));

            if (type == null && __IsMissing)
            {
                throw new MissingAssemblyException((MissingAssembly)this);
            }
            return(type);
        }
Exemple #4
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);
        }
Exemple #5
0
        internal Type Expand(Type type, Assembly context, bool throwOnError, string originalName)
        {
            if (type == null)
            {
                if (throwOnError)
                {
                    throw new TypeLoadException(originalName);
                }
                return(null);
            }
            if (nested != null)
            {
                foreach (string nest in nested)
                {
                    type = type.FindNestedType(TypeName.Split(TypeNameParser.Unescape(nest)));
                    if (type == null)
                    {
                        if (throwOnError)
                        {
                            throw new TypeLoadException(originalName);
                        }
                        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);
                    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);
        }