例如System.Net.HttpStatusCode Enum,我想获取HTTP状态代码而不是HTTP状态文本。
System.Net.HttpStatusCode.Forbidden
应该返回403而不是“Forbidden”。
如何提取值?
答案 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
现在让我们详细说明一下...
如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
打印正确的值!
要回答这个问题,我将关注@Hans Passant的an answer:
JIT编译器需要一个值类型的定义,该值类型用于在装箱时描述其布局。它们中的大多数都被放入mscorlib中,例如System.Int32。使用enum关键字可以创建新的值类型。因此,编译器必须在元数据中为其提供定义。您正在看的是哪个。您将看到ToString()使用的每个枚举成员的静态字段。还有一个实例字段名称value__,用于存储枚举值。关键是它仅存在于枚举值的盒装版本中。
由于我们的解决方案返回的值类型为 object ,因此有人会尝试按以下方式修改 @JaredPar 的答案
Object value = (object)LongEnum.min;
Console.WriteLine(value);
不过,这只会打印成员名称min
。