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