public BlobReader Skip()
        {
            BlobReader        reader   = _reader;
            SignatureTypeCode typeCode = reader.ReadSignatureTypeCode();

            switch (typeCode)
            {
            case SignatureTypeCode.Boolean:
            case SignatureTypeCode.Char:
            case SignatureTypeCode.SByte:
            case SignatureTypeCode.Byte:
            case SignatureTypeCode.Int16:
            case SignatureTypeCode.UInt16:
            case SignatureTypeCode.Int32:
            case SignatureTypeCode.UInt32:
            case SignatureTypeCode.Int64:
            case SignatureTypeCode.UInt64:
            case SignatureTypeCode.IntPtr:
            case SignatureTypeCode.UIntPtr:
            case SignatureTypeCode.Single:
            case SignatureTypeCode.Double:
                break;

            case SignatureTypeCode.Object:
            case SignatureTypeCode.String:
                break;

            case SignatureTypeCode.Array:
                reader = new TypeSignature(reader).Skip();
                reader = new ArrayShapeSignature(reader).Skip();
                break;

            case SignatureTypeCode.FunctionPointer:
                throw new NotImplementedException(string.Format("{0} is not yet implemented.", typeCode));

            case SignatureTypeCode.GenericTypeInstance:
                reader.ReadSignatureTypeCode();
                reader.ReadTypeHandle();

                int argumentCount = reader.ReadCompressedInteger();
                for (int i = 0; i < argumentCount; i++)
                {
                    reader = new TypeSignature(reader).Skip();
                }

                break;

            case SignatureTypeCode.GenericMethodParameter:
            case SignatureTypeCode.GenericTypeParameter:
                // skip the generic parameter index
                reader.ReadCompressedInteger();
                break;

            case SignatureTypeCode.TypeHandle:
                reader.ReadTypeHandle();
                break;

            case SignatureTypeCode.Pointer:
                while (reader.IsCustomModifier())
                {
                    reader = new CustomModifierSignature(reader).Skip();
                }

                if (reader.PeekSignatureTypeCode() == SignatureTypeCode.Void)
                {
                    reader.ReadSignatureTypeCode();
                }
                else
                {
                    reader = new TypeSignature(reader).Skip();
                }

                break;

            case SignatureTypeCode.SZArray:
                while (reader.IsCustomModifier())
                {
                    reader = new CustomModifierSignature(reader).Skip();
                }

                reader = new TypeSignature(reader).Skip();
                break;

            default:
                throw new InvalidOperationException("Invalid signature type code.");
            }

            return(reader);
        }
        public BlobReader Skip()
        {
            BlobReader reader = _reader;
            SignatureTypeCode typeCode = reader.ReadSignatureTypeCode();

            switch (typeCode)
            {
            case SignatureTypeCode.Boolean:
            case SignatureTypeCode.Char:
            case SignatureTypeCode.SByte:
            case SignatureTypeCode.Byte:
            case SignatureTypeCode.Int16:
            case SignatureTypeCode.UInt16:
            case SignatureTypeCode.Int32:
            case SignatureTypeCode.UInt32:
            case SignatureTypeCode.Int64:
            case SignatureTypeCode.UInt64:
            case SignatureTypeCode.IntPtr:
            case SignatureTypeCode.UIntPtr:
            case SignatureTypeCode.Single:
            case SignatureTypeCode.Double:
                break;

            case SignatureTypeCode.Object:
            case SignatureTypeCode.String:
                break;

            case SignatureTypeCode.Array:
                reader = new TypeSignature(reader).Skip();
                reader = new ArrayShapeSignature(reader).Skip();
                break;

            case SignatureTypeCode.FunctionPointer:
                throw new NotImplementedException(string.Format("{0} is not yet implemented.", typeCode));

            case SignatureTypeCode.GenericTypeInstance:
                reader.ReadSignatureTypeCode();
                reader.ReadTypeHandle();

                int argumentCount = reader.ReadCompressedInteger();
                for (int i = 0; i < argumentCount; i++)
                    reader = new TypeSignature(reader).Skip();

                break;

            case SignatureTypeCode.GenericMethodParameter:
            case SignatureTypeCode.GenericTypeParameter:
                // skip the generic parameter index
                reader.ReadCompressedInteger();
                break;

            case SignatureTypeCode.TypeHandle:
                reader.ReadTypeHandle();
                break;

            case SignatureTypeCode.Pointer:
                while (reader.IsCustomModifier())
                    reader = new CustomModifierSignature(reader).Skip();

                if (reader.PeekSignatureTypeCode() == SignatureTypeCode.Void)
                    reader.ReadSignatureTypeCode();
                else
                    reader = new TypeSignature(reader).Skip();

                break;

            case SignatureTypeCode.SZArray:
                while (reader.IsCustomModifier())
                    reader = new CustomModifierSignature(reader).Skip();

                reader = new TypeSignature(reader).Skip();
                break;

            default:
                throw new InvalidOperationException("Invalid signature type code.");
            }

            return reader;
        }