如何使用反射获取枚举成员的整数值?

How to get the integral value of an Enum member using Reflection?

考虑以下枚举:

[Flags]
public enum Digit:
    UInt64
{
    None = 00 << 00,

    One = 01 << 00,
    Two = 01 << 01,
    Three = 01 << 02,
    // Etcetera...

    Other = UInt64.MaxValue - 1,
    Unknown = UInt64.MaxValue,
}

var type = typeof(Digit);
// Returns System.String [].
var names = Enum.GetNames(type);
// Returns System.Array.
var values = Enum.GetValues(type);
// Returns IEnumerable<object>.
var values = Enum.GetValues(type).Cast<object>();

现在,我想获取 Enum 成员的数值,而不必将它们强制转换为特定的整数类型。这是为了代码生成目的,所以下面是我希望能够生成的代码示例:

[Flags]
public enum Digit:
    UInt64
{
    None = 0,

    One = 1,
    Two = 2,
    Three = 4,
    // Etcetera...

    Other = 18446744073709551614,
    Unknown = 18446744073709551615,
}

当然,我可以通过调用 Enum.GetUnderlyingType(type); 检查枚举的基础类型,并使用条件代码来转换每个案例,但想知道是否有更直接的方法。

请注意,我只是在寻找整数值的文本表示,不需要对其进行任何算术运算或操作。

我是不是遗漏了一些简单的东西,或者没有转换就没有办法做到这一点?

我认为没有某种转换就无法做到这一点,但您可以在不使用条件代码的情况下做到这一点。

例如:

using System;
using System.Linq;

static class Program
{
    [Flags]
    public enum Digit :
        UInt64
    {
        None = 00 << 00,

        One   = 01 << 00,
        Two   = 01 << 01,
        Three = 01 << 02,
        // Etcetera...

        Other   = UInt64.MaxValue - 1,
        Unknown = UInt64.MaxValue,
    }

    public static void Main()
    {
        var type           = typeof(Digit);
        var values         = Enum.GetValues(type);
        var underlyingType = Enum.GetUnderlyingType(type);

        var strings =
            values.Cast<object>()
            .Select(item => Convert.ChangeType(item, underlyingType).ToString())
            .ToArray();

        Console.WriteLine(string.Join(", ", strings));
    }
}

这输出:0, 1, 2, 4, 18446744073709551614, 18446744073709551615