예제 #1
0
        ITypeDefOrRef ResolveType_NoLock(Int32 position)
        {
            this.Stream.Position = position;

            InlineOperand operand = new InlineOperand(this.Reader);

            if (operand.IsToken)
            {
                MDToken token = new MDToken(operand.Token);

                if (token.Table == Table.TypeDef)
                {
                    return(this.Module.ResolveTypeDef(token.Rid));
                }
                else if (token.Table == Table.TypeRef)
                {
                    return(this.Module.ResolveTypeRef(token.Rid));
                }
                else if (token.Table == Table.TypeSpec)
                {
                    return(this.Module.ResolveTypeSpec(token.Rid));
                }

                throw new Exception("Unable to resolve type: bad MDToken table");
            }
            else
            {
                TypeData data = operand.Data as TypeData;

                // Resolve via name
                TypeName      typeName     = new TypeName(data.Name);
                NameResolver  nameResolver = new NameResolver(this.Module);
                ITypeDefOrRef typeDefOrRef = nameResolver.ResolveTypeDefOrRef(typeName);

                if (typeDefOrRef == null)
                {
                    throw new Exception(String.Format(
                                            "Unable to resolve ITypeDefOrRef from given name: {0}",
                                            typeName.FullName));
                }

                // Apply generics, if any (resulting in a TypeSpec)
                if (data.GenericTypes.Length > 0)
                {
                    typeDefOrRef = ApplyGenerics(typeDefOrRef, data);
                }

                if (typeDefOrRef == null)
                {
                    throw new Exception(String.Format(
                                            "Unable to apply generic types: {0}", typeName.FullName
                                            ));
                }

                // Apply [], *, &
                typeDefOrRef = SigUtil.FromBaseSig(typeDefOrRef.ToTypeSig(), typeName.Modifiers)
                               .ToTypeDefOrRef();

                return(typeDefOrRef);
            }
        }