如何从System.Enum转换为基本整数?

我想创build一个通用的方法来转换任何System.Enum派生types为其相应的整数值,而不是铸造,最好不分析string。

例如,我想要的是这样的:

// Trivial example, not actually what I'm doing. class Converter { int ToInteger(System.Enum anEnum) { (int)anEnum; } } 

但是这似乎不起作用。 Resharper报告说,您不能将“System.Enum”types的expression式转换为键入“int”。

现在我已经想出了这个解决scheme,但我宁愿有更有效的东西。

 class Converter { int ToInteger(System.Enum anEnum) { return int.Parse(anEnum.ToString("d")); } } 

有什么build议么?

如果你不想投,

 Convert.ToInt32() 

可以做的伎俩。

直接(int)enumValue (通过(int)enumValue )是不可能的。 请注意,这也是“危险的”,因为枚举可以有不同的基础types( intlongbyte …)。

更正式地说: System.EnumInt32没有直接的inheritance关系(虽然都是ValueType ),所以显式types转换在types系统中是不正确的

我得到它的工作,通过铸造一个对象,然后到一个int:

 public static class EnumExtensions { public static int ToInt(this Enum enumValue) { return (int)((object)enumValue); } } 

这是丑陋的,可能不是最好的方法。 我会一直搞乱它,看看我能不能拿出更好的东西….

编辑:刚刚发布Convert.ToInt32(enumValue)的作品,并注意到MartinStettner打败了我。

 public static class EnumExtensions { public static int ToInt(this Enum enumValue) { return Convert.ToInt32(enumValue); } } 

testing:

 int x = DayOfWeek.Friday.ToInt(); Console.WriteLine(x); // results in 5 which is int value of Friday 

编辑2:在评论中,有人说这只适用于C#3.0。 我只是在VS2005中testing了这个,它工作:

 public static class Helpers { public static int ToInt(Enum enumValue) { return Convert.ToInt32(enumValue); } } static void Main(string[] args) { Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday)); } 

为什么你需要用辅助方法重新发明轮子? 将enum值转换为其基础types是完全合法的。

这是less打字,在我看来更可读,使用…

 int x = (int)DayOfWeek.Tuesday; 

…而不是像…

 int y = Converter.ToInteger(DayOfWeek.Tuesday); // or int z = DayOfWeek.Tuesday.ToInteger(); 

如果您需要将任何枚举转换为其基础types(并非所有枚举都由int支持),那么您可以使用:

 return System.Convert.ChangeType( enumValue, Enum.GetUnderlyingType(enumValue.GetType())); 

从我的答案这里 :

鉴于如在:

 Enum e = Question.Role; 

那么这些工作:

 int i = Convert.ToInt32(e); int i = (int)(object)e; int i = (int)Enum.Parse(e.GetType(), e.ToString()); int i = (int)Enum.ToObject(e.GetType(), e); 

最后两个是丑陋的。 第一个应该更可读,但第二个更快。 或者可能是一个扩展方法是最好的,两全其美的。

 public static int GetIntValue(this Enum e) { return e.GetValue<int>(); } public static T GetValue<T>(this Enum e) where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> { return (T)(object)e; } 

现在你可以打电话给:

 e.GetValue<int>(); //or e.GetIntValue(); 

System.Enum投射到一个int适用于我(这也是在MSDN上 )。 也许这是一个Resharper错误。

不要忘记,枚举types本身有一堆的静态辅助函数。 如果您只想将枚举的实例转换为相应的整数types,那么投射可能是最有效的方法。

我认为ReSharper在抱怨,因为Enum不是任何特定types的枚举,枚举本身是从标量值types派生的,而不是Enum。 如果你需要以一种通用的方式进行适应性的转换,我会说这可以很好地适应你(请注意枚举types本身也包含在generics中:

 public static EnumHelpers { public static T Convert<T, E>(E enumValue) { return (T)enumValue; } } 

这可以像这样使用:

 public enum StopLight: int { Red = 1, Yellow = 2, Green = 3 } // ... int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red); 

我不能肯定地说我的头顶,但上面的代码甚至可以支持C#的types推断,允许以下:

 int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red);