Inheritance: TypeSignature, IResolvable
Exemplo n.º 1
0
        private static TypeSignature ReadTypeSignature(
            MetadataImage image,
            IBinaryStreamReader reader,
            RecursionProtection protection)
        {
            var elementType = (ElementType)reader.ReadByte();

            switch (elementType)
            {
            case ElementType.Array:
                return(ArrayTypeSignature.FromReader(image, reader, protection));

            case ElementType.Boxed:
                return(BoxedTypeSignature.FromReader(image, reader, protection));

            case ElementType.ByRef:
                return(ByReferenceTypeSignature.FromReader(image, reader, protection));

            case ElementType.CModOpt:
                return(OptionalModifierSignature.FromReader(image, reader, protection));

            case ElementType.CModReqD:
                return(RequiredModifierSignature.FromReader(image, reader, protection));

            case ElementType.Class:
                return(TypeDefOrRefSignature.FromReader(image, reader, protection));

            case ElementType.FnPtr:
                return(FunctionPointerTypeSignature.FromReader(image, reader, protection));

            case ElementType.GenericInst:
                return(GenericInstanceTypeSignature.FromReader(image, reader, protection));

            case ElementType.MVar:
                return(GenericParameterSignature.FromReader(image, reader, GenericParameterType.Method));

            case ElementType.Pinned:
                return(PinnedTypeSignature.FromReader(image, reader, protection));

            case ElementType.Ptr:
                return(PointerTypeSignature.FromReader(image, reader, protection));

            case ElementType.Sentinel:
                return(SentinelTypeSignature.FromReader(image, reader, protection));

            case ElementType.SzArray:
                return(SzArrayTypeSignature.FromReader(image, reader, protection));

            case ElementType.ValueType:
                var type = TypeDefOrRefSignature.FromReader(image, reader, protection);
                type.IsValueType = true;
                return(type);

            case ElementType.Var:
                return(GenericParameterSignature.FromReader(image, reader, GenericParameterType.Type));

            default:
                return(MsCorLibTypeSignature.FromElementType(image, elementType));
            }
        }
Exemplo n.º 2
0
        public static TypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var elementType = (ElementType)reader.ReadByte();

            switch (elementType)
            {
            case ElementType.Array:
                return(ArrayTypeSignature.FromReader(header, reader));

            case ElementType.Boxed:
                return(BoxedTypeSignature.FromReader(header, reader));

            case ElementType.ByRef:
                return(ByReferenceTypeSignature.FromReader(header, reader));

            case ElementType.CModOpt:
                return(OptionalModifierSignature.FromReader(header, reader));

            case ElementType.CModReqD:
                return(RequiredModifierSignature.FromReader(header, reader));

            case ElementType.Class:
                return(TypeDefOrRefSignature.FromReader(header, reader));

            case ElementType.FnPtr:
                return(FunctionPointerTypeSignature.FromReader(header, reader));

            case ElementType.GenericInst:
                return(GenericInstanceTypeSignature.FromReader(header, reader));

            case ElementType.MVar:
                return(GenericParameterSignature.FromReader(header, reader, GenericParameterType.Method));

            case ElementType.Pinned:
                return(PinnedTypeSignature.FromReader(header, reader));

            case ElementType.Ptr:
                return(PointerTypeSignature.FromReader(header, reader));

            case ElementType.Sentinel:
                return(SentinelTypeSignature.FromReader(header, reader));

            case ElementType.SzArray:
                return(SzArrayTypeSignature.FromReader(header, reader));

            case ElementType.ValueType:
                var type = TypeDefOrRefSignature.FromReader(header, reader);
                type.IsValueType = true;
                return(type);

            case ElementType.Var:
                return(GenericParameterSignature.FromReader(header, reader, GenericParameterType.Type));

            default:
                return(MsCorLibTypeSignature.FromElementType(header, elementType));
            }
            throw new NotSupportedException();
        }
Exemplo n.º 3
0
        public static TypeSignature ReadFieldOrPropType(MetadataHeader header, IBinaryStreamReader reader)
        {
            var elementType = (ElementType)reader.ReadByte();

            switch (elementType)
            {
            case ElementType.Boxed:
                return(header.TypeSystem.Object);

            case ElementType.SzArray:
                return(new SzArrayTypeSignature(ReadFieldOrPropType(header, reader)));

            case ElementType.Enum:
                return(FromAssemblyQualifiedName(header, reader.ReadSerString()));

            default:
                return(MsCorLibTypeSignature.FromElementType(header, elementType));
            }
        }
Exemplo n.º 4
0
        private MsCorLibTypeSignature CreateSignature(ElementType type, string name, bool isValueType)
        {
            MsCorLibTypeSignature signature;

            if (_isMsCorLib)
            {
                if (_typeDefinitions == null)
                    _typeDefinitions = _header.GetStream<TableStream>().GetTable<TypeDefinition>();
                signature= new MsCorLibTypeSignature(_typeDefinitions.First(x => x.Name == name), type, isValueType);
            }
            else
            {
                signature = new MsCorLibTypeSignature(new TypeReference(MsCorLibReference, "System", name)
                {
                    Header = _header
                }, type, isValueType);
            }

            _typesByName[name] = signature;
            _typesByElementType[type] = signature;
            return signature;
        }
Exemplo n.º 5
0
 private TypeSignature ImportCorlibTypeSignature(MsCorLibTypeSignature corlibType)
 {
     return _tableStreamBuffer.StreamHeader.MetadataHeader.TypeSystem.GetMscorlibType(corlibType);
 }
Exemplo n.º 6
0
        /// <summary>
        /// Determines whether two types are considered equal according to their signature.
        /// </summary>
        /// <param name="signature1">The first type to compare.</param>
        /// <param name="descriptor">The second type to compare.</param>
        /// <returns><c>True</c> if the types are considered equal, <c>False</c> otherwise.</returns>
        public bool MatchTypes(MsCorLibTypeSignature signature1, ITypeDescriptor descriptor)
        {
            if (signature1 == null && descriptor == null)
                return true;
            if (signature1 == null || descriptor == null)
                return false;

            var signature2 = descriptor as TypeDefOrRefSignature;
            if (signature2 != null)
                return MatchTypes(signature1.Type, signature2.Type);

            var corlibType = descriptor as MsCorLibTypeSignature;
            if (corlibType != null)
                return signature1.ElementType == corlibType.ElementType;

            var typeDefOrRef = descriptor as ITypeDefOrRef;
            if (typeDefOrRef != null)
                return MatchTypes(signature1.Type, typeDefOrRef);

            return false;
        }