internal static T ReadEnumGeneric <T>(BinaryReader reader) { var type = typeof(T); var enumTypeInfo = BoisTypeCache.GetEnumType(type); if (enumTypeInfo == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumTypeInfo.KnownType) { case EnBasicEnumType.Int32: if (enumTypeInfo.IsNullable) { var val = NumericSerializers.ReadVarInt32Nullable(reader); if (val == null) { return(default); } return((T)Enum.ToObject(enumTypeInfo.BareType, val)); }
/// <summary> /// VarInt - Format: (Embedded-Nullable-0-0-0-0-0-0) [if not embedded?0-0-0-0-0-0-0-0] /// Embeddable range: 0..63 /// </summary> internal static void WriteValue(BinaryWriter writer, Enum e, Type type) { if (e == null) { WriteNullValue(writer); return; } var enumType = BoisTypeCache.GetEnumType(type); if (enumType == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumType.KnownType) { case EnBasicEnumType.Int32: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (int?)(int)(object)e); } else { NumericSerializers.WriteVarInt(writer, (int)(object)e); } break; case EnBasicEnumType.Byte: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (byte?)(byte)(object)e); } else { writer.Write((byte)(object)e); } break; case EnBasicEnumType.Int16: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (short?)(short)(object)e); } else { NumericSerializers.WriteVarInt(writer, (short)(object)e); } break; case EnBasicEnumType.Int64: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (long?)(long)(object)e); } else { NumericSerializers.WriteVarInt(writer, (long)(object)e); } break; case EnBasicEnumType.UInt16: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (ushort?)(ushort)(object)e); } else { NumericSerializers.WriteVarInt(writer, (ushort)(object)e); } break; case EnBasicEnumType.UInt32: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (uint?)(uint)(object)e); } else { NumericSerializers.WriteVarInt(writer, (uint)(object)e); } break; case EnBasicEnumType.UInt64: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (ulong?)(ulong)(object)e); } else { NumericSerializers.WriteVarInt(writer, (ulong)(object)e); } break; case EnBasicEnumType.SByte: if (enumType.IsNullable) { NumericSerializers.WriteVarInt(writer, (sbyte?)(sbyte)(object)e); } else { writer.Write((sbyte)(object)e); } break; default: throw new Exception($"Enum type not supported '{type.Name}'. Contact the author please https://github.com/salarcode/Bois/issues "); } }
internal static Enum ReadEnum(BinaryReader reader, Type type) { var enumType = BoisTypeCache.GetEnumType(type); if (enumType == null) { throw new Exception($"Cannot determine the type of enum '{type.Name}'"); } switch (enumType.KnownType) { case EnBasicEnumType.Int32: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt32Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt32(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Byte: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarByteNullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = reader.ReadByte(); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Int16: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt16Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt16(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.Int64: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarInt64Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarInt64(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt16: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt16Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt16(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt32: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt32Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt32(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.UInt64: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarUInt64Nullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = NumericSerializers.ReadVarUInt64(reader); return((Enum)Enum.ToObject(enumType.BareType, val)); } case EnBasicEnumType.SByte: if (enumType.IsNullable) { var val = NumericSerializers.ReadVarSByteNullable(reader); if (val == null) { return(null); } return((Enum)Enum.ToObject(enumType.BareType, val)); } else { var val = reader.ReadSByte(); return((Enum)Enum.ToObject(enumType.BareType, val)); } default: throw new Exception($"Enum type not supported '{type.Name}'. Contact the author please https://github.com/salarcode/Bois/issues "); } }