如何使用反射获取枚举成员的整数值?
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
考虑以下枚举:
[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