如何从Enum获取数值?

kur*_*ura 55 .net c# reflection enums properties

例如System.Net.HttpStatusCode Enum,我想获取HTTP状态代码而不是HTTP状态文本. System.Net.HttpStatusCode.Forbidden应该返回403而不是"禁止".

我该如何提取价值?

Jar*_*Par 84

对于大多数Enum来说,只需转换为int32的基类型.

int value = (int)System.Net.HttpStatusCode.Forbidden;
Run Code Online (Sandbox Code Playgroud)

  • 我可以补充说,您可以通过使用静态Enum.GetUnderlyingType(typeof(MyEnum))方法获取枚举的基础类型. (8认同)
  • @Jimmy,任何具有不同基类型的枚举.在这些情况下,您只需要转换为适当的基类型(uint32等)...... (5认同)
  • 什么是少数人的例子,不能简单地演员? (3认同)

Eri*_*ich 19

你可以把它变成一个整数!

int code = (int)enumVariable
Run Code Online (Sandbox Code Playgroud)


Die*_*r G 7

System.Convert.ToInt32(response.StatusCode)返回statusCode编号

  • 当你有一个枚举,但你没有枚举的类型时,这是有效的.例如`void DoSomethingWithEnum(Enum value){int X = Convert.ToInt32(value); 在这种情况下,对int的正常强制转换不起作用. (7认同)

Dec*_*oth 6

我认为@JaredPar的回答很好,但正如他自己解释的那样,它并不总是有效,所以我将在这里提供完整的答案。

简短的回答

而不是简单地转换,使用以下代码

var value = 
    typeof(System.Net.HttpStatusCode)
        .GetField("value__")
        .GetValue(System.Net.HttpStatusCode.Forbidden);

Console.WriteLine(value); // 403
Run Code Online (Sandbox Code Playgroud)

现在让我们详细说明一下这个......

Enum 的数值并不总是 int (!!!)

正如文档中所解释的,

每个枚举类型都有一个对应的整数类型,称为枚举类型的基础类型。此基础类型必须能够表示枚举中定义的所有枚举器值。枚举声明可以显式声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 的基础类型。请注意,char 不能用作基础类型。未显式声明基础类型的枚举声明具有 int 基础类型。

所以,让我们想象一下你正在处理一个声明为的枚举

enum LongEnum : long 
{ 
    min = long.MinValue, 
    max = long.MaxValue 
}
Run Code Online (Sandbox Code Playgroud)

通过应用@JaredPar给出的解决方案

int value = (int)LongEnum.min;
Run Code Online (Sandbox Code Playgroud)

你会得到以下错误:

错误 CS0221:常量值“-9223372036854775808”无法转换为“int”(使用“unchecked”语法覆盖)

所以,为了解决这个问题,诀窍当然是,正如你在上面看到的,使用Reflection

int value = (int)LongEnum.min;
Run Code Online (Sandbox Code Playgroud)

打印正确的值!

但是......枚举的'value__'字段是什么???

为了回答这个问题,我将遵循@Hans Passant的回答

JIT 编译器需要一个值类型的定义来描述它被装箱时的布局。它们中的大多数都被烘焙到 mscorlib 中,如 System.Int32。enum 关键字允许您创建新的值类型。因此,编译器必须在元数据中为其提供定义。这就是你在看什么。您将看到 ToString() 使用的每个枚举成员的静态字段。还有一个实例字段名称 value__ 存储枚举值。关键是这仅存在于枚举值的盒装版本中。

PS...

由于我们的解决方案返回一个object类型的值,有人会想修改@JaredPar的答案如下

Object value = (object)LongEnum.min;

Console.WriteLine(value);
Run Code Online (Sandbox Code Playgroud)

尽管如此,那只会打印成员name min