C#数字枚举值为字符串

时间:2010-08-09 22:33:03

标签: c# enums return-value return-type

我有以下枚举:

public enum Urgency {
    VeryHigh = 1,
    High     = 2,
    Routine  = 4
}

我可以像这样获取枚举“值”字符串

((int)Urgency.Routine).ToString() // returns "4"  

注意:这与:

不同
Urgency.Routine.ToString() // returns "Routine"
(int)Urgency.Routine       // returns 4

有没有办法可以创建一个扩展类,或者一个静态的utliity类,它会提供一些语法糖? :)

8 个答案:

答案 0 :(得分:97)

你应该能够使用Enums ToString方法的重载为它提供一个格式字符串,这将打印出枚举值作为字符串。

public static class Program
{
    static void Main(string[] args)
    {
        var val = Urgency.High;
        Console.WriteLine(val.ToString("D")); 
    }
}

public enum Urgency 
{ 
    VeryHigh = 1,
    High = 2,
    Low = 4
}

答案 1 :(得分:23)

为了对枚举实现更多“人类可读”的描述(例如“非常高”而不是“示例中的”非常高“),我使用属性修饰了枚举值,如下所示:

public enum MeasurementType
{
    Each,

    [DisplayText("Lineal Metres")]
    LinealMetre,

    [DisplayText("Square Metres")]
    SquareMetre,

    [DisplayText("Cubic Metres")]
    CubicMetre,

    [DisplayText("Per 1000")]
    Per1000,

    Other
}


public class DisplayText : Attribute
{

    public DisplayText(string Text)
    {
        this.text = Text;
    }


    private string text;


    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

然后,使用这样的扩展方法:

    public static string ToDescription(this Enum en)
    {

        Type type = en.GetType();

        MemberInfo[] memInfo = type.GetMember(en.ToString());

        if (memInfo != null && memInfo.Length > 0)
        {

            object[] attrs = memInfo[0].GetCustomAttributes(
                                          typeof(DisplayText),

                                          false);

            if (attrs != null && attrs.Length > 0)

                return ((DisplayText)attrs[0]).Text;

        }

        return en.ToString();

    }

然后,您只需调用

myEnum.ToDescription()
即可将枚举显示为更易读的文字。

答案 2 :(得分:4)

如果您只想处理此枚举,请使用Mark Byer的解决方案。

更通用的解决方案:

public static string NumberString(this Enum enVal) 
{
    return Convert.ToDecimal(enVal).ToString("0");
}

转换为十进制意味着您不需要明确地处理8种不同的允许底层整数类型,因为它们都无损地转换为十进制而不是相互转换(ulong和long不会在彼此之间无损转换但是两者都可以处理所有其余的事情)。这样做可能会更快(特别是如果你按照你的比较顺序选好),但是相对来说收益更加冗长。

编辑:

上述情况并不像Frankentosh那样好,但Frankentosh通过这个问题看到了真正的问题并且非常雄辩地解决了这个问题。

答案 3 :(得分:3)

有点反思怎么样?应该适用于所有基础类型。

public static class EnumTools
{
    public static string ToRawValueString(this Enum e)
    {
        return e
            .GetType()
            .GetFields(BindingFlags.Public | BindingFlags.Static)
            .First(f => f.Name==e.ToString())
            .GetRawConstantValue()
            .ToString();
    }
}

然后:

Console.WriteLine(Urgency.High.ToRawValueString()); //Writes "2"

答案 4 :(得分:3)

很棒的东西......我现在已经为我的项目添加了一个扩展方法

public static class EnumExtensions 
{ 
    public static string NumberString(this Enum enVal) 
    { 
        return enVal.ToString("D"); 
    }
} 

现在我可以通过调用Urgency.Routine.NumberString();来获取int值 - 作为字符串 - 感谢Frankentosh和Jon :)

答案 5 :(得分:2)

如果您愿意,可以使扩展方法适用于所有枚举:

public static string ToValueString(this Enum enumValue) 
{
    if (enumValue.GetType().GetEnumUnderlyingType() == typeof(int))
        return ((int)(object)enumValue).ToString();
    else if (enumValue.GetType().GetEnumUnderlyingType() == typeof(byte))
        return ((byte)(object)enumValue).ToString();
    ... 
}        

答案 6 :(得分:1)

您可以为特定类型编写扩展方法:

public static class UrgencyExtension
{
    public static string ToIntegerString(this Urgency u)
    {
        return ((int)u).ToString();
    }
}

使用如下:

Urgency u = Urgency.Routine;
string s = u.ToIntegerString();

答案 7 :(得分:1)

一种简单的方法

((Urgency)4).ToString() // returns "Routine"