我有以下枚举:
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类,它会提供一些语法糖? :)
答案 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"