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

orj*_*orj 88 c# enums type-conversion

我想创建一个泛型方法,用于将任何System.Enum派生类型转换为其对应的整数值,而不进行转换,最好不解析字符串.

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

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

但这似乎不起作用.Resharper报告您无法将类型为"System.Enum"的表达式转换为"int"类型.

现在我已经提出了这个解决方案,但我宁愿提高效率.

class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        return int.Parse(anEnum.ToString("d"));
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mar*_*ner 131

如果你不想演员,

Convert.ToInt32()
Run Code Online (Sandbox Code Playgroud)

可以做到这一点.

直接演员(通过(int)enumValue)是不可能的.注意,这也将是"危险的",因为一个枚举可以有不同的基础类型(int,long,byte...).

更正式:System.Enum没有直接的继承关系Int32(虽然两者都是ValueTypes),所以显式转换在类型系统中是不正确的

  • `Converter.ToInteger(MyEnum.MyEnumConstant);`这里不会给你错误.请编辑该部分. (2认同)

BFr*_*ree 38

我通过强制转换为对象然后转换为int来实现它:

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return (int)((object)enumValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:即将发布的Convert.ToInt32(enumValue)也可以,并注意到MartinStettner打败了我.

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

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

编辑2:在评论中,有人说这只适用于C#3.0.我刚刚在VS2005中对此进行了测试,结果如下:

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));
    }
Run Code Online (Sandbox Code Playgroud)


Dre*_*kes 13

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

return System.Convert.ChangeType(
    enumValue,
    Enum.GetUnderlyingType(enumValue.GetType()));
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一的防弹答案. (5认同)

Luk*_*keH 10

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

它打字较少,而且在我看来更具可读性,使用...

int x = (int)DayOfWeek.Tuesday;
Run Code Online (Sandbox Code Playgroud)

......而不是......

int y = Converter.ToInteger(DayOfWeek.Tuesday);
// or
int z = DayOfWeek.Tuesday.ToInteger();
Run Code Online (Sandbox Code Playgroud)

  • 我想转换任何枚举值.即,我有各种具有枚举字段的类,这些字段由一些代码以通用方式处理.这就是为什么简单的转换为int是不合适的. (6认同)
  • 有时您不能直接转换枚举,例如在通用方法的情况下.因为泛型方法不能限制为枚举,所以将它约束为类似struct的东西,不能将其强制转换为int.在这种情况下,您可以使用Convert.ToInt32(枚举)来执行此操作. (2认同)