C#数字枚举值作为string

我有以下枚举:

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

我可以像这样获取一个枚举“值”的string

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

注意:这不同于:

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

有没有一种方法可以创build一个扩展类,或一个静态的utliity类,这将提供一些语法糖? 🙂

你应该能够使用Enums的ToString方法的重载给它一个格式string,这将打印出一个string的枚举值。

 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 } 

为了获得更多的“人类可读的”枚举的描述(例如“非常高”,而不是在你的例子中“VeryHigh”),我已经装饰枚举值的属性如下:

 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() 

为了显示您的枚举更可读的文本。

如果你只想处理这个枚举,请使用Mark Byer的解决scheme。

对于更一般的解决scheme:

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

转换为十进制意味着你不需要明确地处理8种不同的允许的底层整型,因为它们都是无损地转换为十进制而不是相互转换(ulong和long不能相互之间无损地转换,但是都可以处理其他的)。 这样做可能会更快(尤其是如果你按照你的比较顺序select的话),但是对于相对较less的收益来说更加冗长。

编辑:

以上不如弗兰肯托斯的,弗兰肯托什通过这个问题看到了真正的问题,并非常雄辩地解决了这个问题。

如何反思一下? 应该与所有基础types一起工作。

 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" 

如果你想,你可以使扩展方法适用于所有的枚举:

 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(); ... } 

伟大的东西…我现在已经添加了扩展方法到我的项目

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

现在我可以通过调用Urgency.Routine.NumberString();来获得int值 – 作为一个stringUrgency.Routine.NumberString(); 感谢Frankentosh和Jon 🙂

你可以为你的特定types写一个扩展方法:

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

使用方法如下:

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