关于c#:如何从System.Enum转换为基本整数?

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)enumValue)是不可能的。注意,这将是"危险的",因为在枚举的基础类型有不同的CAN(intlongbyte……)。

更多的正式System.Enum没有直接关系:继承与Int32(虽然都是ValueTypes),所以不能正确显在型铸造系统


我有它的工作由一个对象然后铸造:一个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));
    }


如果你需要任何枚举类型转换到其潜在的(不支持所有的枚举是由int)然后你可以使用:

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


为什么你需要一个方法把辅助轮?它是完全合法的,其价值是在一enum铸造的基本类型。

它在我的意见和不准确的测试,使用更多的读,……

1
int x = (int)DayOfWeek.Tuesday;

而不是什么样……

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


答案:从我这里

在给定的e

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();


一个从一System.Enum铸造厂精细int(它是我在MSDN)。也许这是一resharper弓。


因为枚举是限制到字节,短,ushort SByte、int、uint,长整型,和一些假设,我们可以做的。

我们可以避免出现在转换使用最大的可用容器。不幸的是,这是不明确的,因为容器的使用则要负数和爆破的爆破(龙想long.maxvalue号码和ulong.maxvalue之间。我们需要进行切换之间的选择基于优先型。

当然,你仍然需要决定要做什么的时候,结果不适合铸造从int。我认为是好的,但仍然有一些问题:

  • 枚举类型是基于一个场空间(长整型int和装修),它是可能的,我想同一个枚举值。
  • 铸造一个装修int.maxvalue异常如果你想掷向一检查区。
  • 这里是我的建议,我会离开它的读者来决定在哪里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);