【问题标题】:C# How to convert an enum to based Bin/Oct/Dec/Hex string and vice versaC# 如何将枚举转换为基于 Bin/Oct/Dec/Hex 字符串,反之亦然
【发布时间】:2015-12-11 06:36:26
【问题描述】:

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

Convert.ToType(Byte,SByte,Int16,UInt16,....) 提供支持,将基于字符串的转换为所需的类型。但是Convert.ToString,对字节类型(unsigned)、short(signed)、int(signed)、long(长)。如果您不注意,您将尝试从 UInt.Max 获取基于 bin 的字符串: Convert.ToString(UInt.MaxValue, 2) 但是没有对 UInt32 的基本支持,所以 2 被解释为 IFormatProvider。 Hex 有一个 ToString Formatprovider,但它提供了不同的输出。转换.ToString(,16)。

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

我会尽快完成,没有后续实施、签名/未签名问题、铸造陷阱。在使用枚举时,您没有枚举通用支持。可能的枚举类型等等。

我想要的只是将任何枚举表示为基于字符串并将基于字符串转换回所需的枚举。

【问题讨论】:

    标签: c# generics enums converter


    【解决方案1】:

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

    BasedEnumConverter 和 Helper:https://gist.github.com/chubbson/816b24a59e5f7e90385e 基于值转换器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 种枚举基本类型)

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 2011-05-27
      • 2011-07-14
      • 2020-05-06
      相关资源
      最近更新 更多