C#如何将枚举转换为基于Bin / Oct / Dec / Hex字符串,反之亦然

时间:2015-12-10 22:36:27

标签: c# generics enums converter

我一直在寻找一种通用方法,将任何类型的枚举表示为基于bin / oct / dec / hex的字符串值。

Convert.To Type (Byte,SByte,Int16,UInt16,....)提供支持,将基于字符串的字符串转换为所需类型。但是Convert.ToString,只有地下室支持类型字节( unsigned ),短(签名),int(签名),long(< EM>长)。如果您不支付attantion,您将尝试从UInt.Max获取基于bin的字符串: Convert.ToString(UInt.MaxValue, 2)但是对于UInt32没有基本支持,所以2被解释为IFormatProvider。 Hex有一个ToString Formatprovider,但它提供的输出不同于。 Convert.ToString(,16)。

Conver.ToString((short)79,16) // 4F
((short)79).ToString("X") // 4f

我会快速完成,没有后续实施,签名/未签名问题,投射陷阱。使用枚举时,您没有枚举通用支持。可能的enumbase类型的virieté等。

所有我想要的,是将任何枚举表示为基于字符串和基于演员的字符串回到所需的枚举。

1 个答案:

答案 0 :(得分:0)

我已经付出了一些努力并为此创建了2个转换器,代码实现可以通过以下要点获得:

BasedEnumConverter和Helper:https://gist.github.com/chubbson/816b24a59e5f7e90385e BasedValueConverter https://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}

请查看代码,给我一个关于性能/ oop的提示,概念错误或可以做得更好。我的第一种方法(或者第二种方法是试图通过一些移位和字符串附加来自我计算值,但是我放弃了8个枚举基类型的原因)