C#如何将枚举转换为基于Bin/Oct/Dec/Hex的字符串,反之亦然
本文关键字:Dec Oct Hex 反之亦然 字符串 Bin 枚举 转换 | 更新日期: 2023-09-27 18:26:20
我正在寻找一种通用的方法,将任何类型的枚举表示为基于bin/oct/dec/hex的字符串值。
Convert.ToType(Byte,SByte,Int16,UInt16,…)提供支持,将基于字符串转换为所需类型。但是Convert.ToString只支持Type byte(unsigned)、short(signedignedong。如果你不注意,你会尝试从UInt获得基于bin的字符串。最大值:Convert.ToString(UInt.MaxValue, 2)
但是没有对UInt32的基本支持,所以2被集成为IFormatProvider。Hex有一个ToString格式提供程序,但它提供的输出与不同。转换.ToString(,16).
Conver.ToString((short)79,16) // 4F
((short)79).ToString("X") // 4f
我会让它快速,没有后续的实现,签名/未签名的问题,铸造陷阱。在使用enum时,您没有enum通用支持。可能的enumbase类型的病毒等。
我想要的只是将任何枚举表示为基于字符串,并将基于字符串强制转换回所需的枚举。
我为此付出了一些努力并创建了2个转换器,代码实现基于以下要点:
BasedEnumConverter和Helper:https://gist.github.com/chubbson/816b24a59e5f7e90385eBasedValueConverterhttps://gist.github.com/chubbson/375b535243c166d28119
void Main()
{
var os = Tshort.Convesionfailed.ToStringOct().Dump(); //000120
BasedEnumConverter<Tshort>.ParseEnumFromOct(os).Dump(); //Conversionfailed
var stsbbin = Tsbyte.BAD.ToStringBin().Dump(); //10000000
BasedEnumConverter<Tsbyte>.ParseEnumFromBin(stsbbin).Dump(); //BAD
var sinthex = Tint.OK.ToStringHex().Dump(); //00000080
BasedEnumConverter<Tint>.ParseEnumFromHex(sinthex).Dump(); //OK
}
enum Tenum : byte { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tbyte : byte { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tsbyte : sbyte { A = 0, B = 1, OK = 127, OK2 = 126, BAD = -128, BAD2 = -127, Convesionfailed = 80 }
enum Tshort : short { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tushort : ushort { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tint : int { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tuint: uint { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tlong : long { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80 }
enum Tulong : ulong { A = 0, B = 1, OK = 128, BAD = 255, Convesionfailed = 80, Min = ulong.MinValue, Max = ulong.MaxValue}
请查看代码,给我一个关于performance/oop的提示,什么是概念上的错误或可以做得更好。我的第一种方法(或第二种方法)是尝试通过一些移位和字符串挂起来自行计算值,但我放弃了这一点,因为有8个枚举基类型)