我正在编写一个序列化程序类,我正在尝试编写一个能够序列化任何枚举的函数(可以由int,byte,ulong ...支持)。这会按我想要的方式工作吗?有没有更好的方法呢?
public bool Serialize<TEnum>(ref TEnum data, TEnum min, TEnum max) where TEnum : struct, IComparable, IFormattable, IConvertible
{
if (!typeof(TEnum).IsEnum)
{
throw new ArgumentException("arguments must be an Enum");
}
Type eType = Enum.GetUnderlyingType(data.GetType());
if (eType == typeof(byte) || eType == typeof(ushort) || eType == typeof(uint) || eType == typeof(ulong))
{
var data2 = (ulong) Convert.ChangeType(data, eType);
var min2 = (ulong) Convert.ChangeType(min, eType);
var max2 = (ulong) Convert.ChangeType(max, eType);
if (IsReading)
{
bool success = bs.Read(out data2, min2, max2);
data = (TEnum) Convert.ChangeType(data2, typeof(TEnum));
return success;
}
bs.Write(data2, min2, max2);
}
else
{
var data2 = (long) Convert.ChangeType(data, eType);
var min2 = (long) Convert.ChangeType(min, eType);
var max2 = (long) Convert.ChangeType(max, eType);
if (IsReading)
{
bool success = bs.Read(out data2, min2, max2);
data = (TEnum) Convert.ChangeType(data2, typeof(TEnum));
return success;
}
bs.Write(data2, min2, max2);
}
return true;
}
答案 0 :(得分:0)
要将long
或ulong
转换为由较小类型的整数支持的enum
,您需要使用Enum.ToObject()
。如果基础数字类型没有相同的字节数,Convert.ChangeType()
将抛出异常。 IConvertible.ToInt64()
或IConvertible.ToUInt64()
会比Convert.ChangeType()
略快,因为后者实际上会调用前者。
除此之外,以下内容应该可以将enum作为8个字节序列化为序列化流。对于非long
枚举,这将比将其序列化为基础数字类型的空间效率更低,但具有允许随后更改基础数值类型的优势(例如,从int
到{ {1}}以容纳额外的long
值而不会使旧的序列化流无效:
[Flags]
示例fiddle。