如何从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( int
, long
, byte
…)。
更正式地说: System.Enum
与Int32
没有直接的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);