private static TypeSignature ReadTypeSignature(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);
}
}