如何从Enum获取数值?

时间:2009-10-08 22:07:37

标签: c# .net reflection properties enums

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

如何提取值?

5 个答案:

答案 0 :(得分:79)

对于大多数Enum而言,只需转换为int32的基本类型。

int value = (int)System.Net.HttpStatusCode.Forbidden;

答案 1 :(得分:19)

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

int code = (int)enumVariable

答案 2 :(得分:7)

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

答案 3 :(得分:0)

您可以使用.NET CLR函数的原则方法。

int value = System.Net.HttpStatusCode.Forbidden.GetHashCode();

答案 4 :(得分:0)

我认为 @JaredPar 的答案很好,但正如他本人解释的那样,它并不总是有效的,因此我将在此处提供完整的答案。

简短答案

使用简单的代码,而不是简单的强制转换

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

Console.WriteLine(value); // 403

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

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

Docu

所述

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

因此,假设您正在处理一个声明为

枚举
enum LongEnum : long 
{ 
    min = long.MinValue, 
    max = long.MaxValue 
}

通过应用 @JaredPar

给出的解决方案
int value = (int)LongEnum.min;

您将收到以下错误:

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

因此,为了解决这个问题,诀窍就是使用 Reflection

object value =
    typeof(LongEnum)
    .GetField("value__")
    .GetValue(LongEnum.min);

Console.WriteLine(value); // -9223372036854775808

打印正确的值!

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

要回答这个问题,我将关注@Hans Passant的an answer

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

P.S。 ...

由于我们的解决方案返回的值类型为 object ,因此有人会尝试按以下方式修改 @JaredPar 的答案

Object value = (object)LongEnum.min;

Console.WriteLine(value);

不过,这只会打印成员名称min