How to convert from System.Enum to base integer?
我想创建一个通用方法,用于将任何System.Enum派生类型转换为其相应的整数值,而不进行强制转换,最好不分析字符串。
我想要的是这样的东西:
1 2 3 4 5 6 7 8 | // Trivial example, not actually what I'm doing. class Converter { int ToInteger(System.Enum anEnum) { (int)anEnum; } } |
但这似乎不起作用。Resharper报告无法将"System.Enum"类型的表达式强制转换为"int"类型。
现在我想出了这个解决方案,但我更希望有更有效的方法。
1 2 3 4 5 6 7 | class Converter { int ToInteger(System.Enum anEnum) { return int.Parse(anEnum.ToString("d")); } } |
有什么建议吗?
如果你不想投,
1 | Convert.ToInt32() |
可以做的伎俩。
直接铸造(通过
更多的正式
我有它的工作由一个对象然后铸造:一个int
1 2 3 4 5 6 7 | public static class EnumExtensions { public static int ToInt(this Enum enumValue) { return (int)((object)enumValue); } } |
这是最好的方式可能是丑陋的和需要的。我会把黄铜它,看看我可以用更好的东西来了……
编辑:只是想后,convert.toint32(enumvalue)作品为好,所以,我和martinstettner拍到它。
1 2 3 4 5 6 7 | public static class EnumExtensions { public static int ToInt(this Enum enumValue) { return Convert.ToInt32(enumValue); } } |
测试:
1 2 | int x = DayOfWeek.Friday.ToInt(); Console.WriteLine(x); // results in 5 which is int value of Friday |
编辑评论:2,有人说这只# Works在C 3.0。我只是这个在VS2005测试样本和它的工作:
1 2 3 4 5 6 7 8 9 10 11 12 | 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)); } |
如果你需要任何枚举类型转换到其潜在的(不支持所有的枚举是由
1 2 3 | return System.Convert.ChangeType( enumValue, Enum.GetUnderlyingType(enumValue.GetType())); |
为什么你需要一个方法把辅助轮?它是完全合法的,其价值是在一
它在我的意见和不准确的测试,使用更多的读,……
1 | int x = (int)DayOfWeek.Tuesday; |
而不是什么样……
1 2 3 | int y = Converter.ToInteger(DayOfWeek.Tuesday); // or int z = DayOfWeek.Tuesday.ToInteger(); |
答案:从我这里
在给定的
1 | Enum e = Question.Role; |
然后论文工作:
1 2 3 4 | 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); |
最后两个是最丑的。第一应该更可读,虽然第二个是多快。或扩展的方法可能是最好的,两全其美。
1 2 3 4 5 6 7 8 9 | 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; } |
现在你可以调用:
1 2 | e.GetValue<int>(); //or e.GetIntValue(); |
一个从一
因为枚举是限制到字节,短,ushort SByte、int、uint,长整型,和一些假设,我们可以做的。
我们可以避免出现在转换使用最大的可用容器。不幸的是,这是不明确的,因为容器的使用则要负数和爆破的爆破(龙想long.maxvalue号码和ulong.maxvalue之间。我们需要进行切换之间的选择基于优先型。
当然,你仍然需要决定要做什么的时候,结果不适合铸造从int。我认为是好的,但仍然有一些问题:
这里是我的建议,我会离开它的读者来决定在哪里expose这个功能;作为辅助或延伸。
1 2 3 4 5 6 7 8 9 10 | public int ToInt(Enum e) { unchecked { if (e.GetTypeCode() == TypeCode.UInt64) return (int)Convert.ToUInt64(e); else return (int)Convert.ToInt64(e); } } |
不要忘记的是,我们有一堆的枚举类型静态辅助函数在它。如果你想要做的所有是一个枚举的实例转换为其对应的整数类型,然后铸造是最有效的方式。
我想是因为我resharper枚举枚举,不是在任何特定的类型,从一个人获得和枚举枚举标量ValueType,逆境。如果你需要adaptable通用铸造在一路,我会说这是你我的套房(注意,枚举类型是通用的,它包括在:
1 2 3 4 5 6 7 | public static EnumHelpers { public static T Convert<T, E>(E enumValue) { return (T)enumValue; } } |
然后可以用样本是这样的:
1 2 3 4 5 6 7 8 9 10 | public enum StopLight: int { Red = 1, Yellow = 2, Green = 3 } // ... int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red); |
I can’t说当然离顶我的头,但上面的代码,甚至可能是C型#支持的推理,包括以下:
1 | int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red); |