// cf. MetadataDecoder<>.DecodeParameterOrThrow. private ParameterSignature DecodeParameter(ref BlobReader signatureReader) { bool isByRef = false; while (true) { var typeCode = signatureReader.ReadSignatureTypeCode(); switch (typeCode) { case SignatureTypeCode.RequiredModifier: case SignatureTypeCode.OptionalModifier: // Skip modifiers. break; case SignatureTypeCode.ByReference: isByRef = true; break; default: var type = DecodeType(ref signatureReader, typeCode); return new ParameterSignature(type, isByRef); } } }
// cf. MetadataDecoder<>.DecodeGenericTypeInstanceOrThrow. private TypeSignature DecodeGenericTypeInstance(ref BlobReader signatureReader) { var typeCode = signatureReader.ReadSignatureTypeCode(); var typeHandle = signatureReader.ReadTypeHandle(); var typeArguments = DecodeGenericTypeArguments(ref signatureReader); int typeArgumentOffset = 0; var type = DecodeType(typeHandle, typeArguments, ref typeArgumentOffset); if (typeArgumentOffset != typeArguments.Length) { // Generic type reference names must include arity // to avoid loading referenced assemblies. throw UnhandledMetadata(); } return type; }
// Ignore modifiers and decode type. private TypeSignature DecodeModifiersAndType(ref BlobReader signatureReader) { while (true) { var typeCode = signatureReader.ReadSignatureTypeCode(); switch (typeCode) { case SignatureTypeCode.RequiredModifier: case SignatureTypeCode.OptionalModifier: // Skip modifiers. break; default: return DecodeType(ref signatureReader, typeCode); } } }