public static BitWriter WriteEnum <TEnum>(
            this BitWriter bitWriter,
            TEnum enumValue)
            where TEnum : struct, IConvertible
        {
            var type = typeof(TEnum);

            if (!type.IsEnum)
            {
                throw new ArgumentException($"{nameof(TEnum)} must be an enum type.");
            }

            var typeCode = enumValue.GetTypeCode();

            var value = Convert.ChangeType(enumValue, typeCode);

            switch (value)
            {
            case byte b: bitWriter.Write(b); break;

            case sbyte sb: bitWriter.Write(sb); break;

            case short i16: bitWriter.Write(i16); break;

            case ushort u16: bitWriter.Write(u16); break;

            case int i32: bitWriter.WriteVariableInt32(i32); break;

            case uint u32: bitWriter.WriteVariableUInt32(u32); break;

            case long i64: bitWriter.WriteVariableInt64(i64); break;

            case ulong u64: bitWriter.WriteVariableUInt64(u64); break;

            default: throw new ArgumentException($"Enum {type.Name} is of unsupported type `{typeCode}`.");
            }

            return(bitWriter);
        }
 public static BitWriter Write(
     this BitWriter bitWriter,
     Guid guid)
 {
     return(bitWriter.Write(guid.ToByteArray()));
 }
 public static BitWriter WriteEpochMilliseconds(
     this BitWriter bitWriter,
     DateTime time)
 {
     return(bitWriter.WriteVariableUInt64((ulong)(time - _epoch).TotalMilliseconds));
 }