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)
System.Convert.ToInt32(response.StatusCode)返回statusCode编号
我认为@JaredPar的回答很好,但正如他自己解释的那样,它并不总是有效,所以我将在这里提供完整的答案。
而不是简单地转换,使用以下代码
var value =
typeof(System.Net.HttpStatusCode)
.GetField("value__")
.GetValue(System.Net.HttpStatusCode.Forbidden);
Console.WriteLine(value); // 403
Run Code Online (Sandbox Code Playgroud)
现在让我们详细说明一下这个......
正如文档中所解释的,
每个枚举类型都有一个对应的整数类型,称为枚举类型的基础类型。此基础类型必须能够表示枚举中定义的所有枚举器值。枚举声明可以显式声明 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)
打印正确的值!
为了回答这个问题,我将遵循@Hans Passant的回答:
JIT 编译器需要一个值类型的定义来描述它被装箱时的布局。它们中的大多数都被烘焙到 mscorlib 中,如 System.Int32。enum 关键字允许您创建新的值类型。因此,编译器必须在元数据中为其提供定义。这就是你在看什么。您将看到 ToString() 使用的每个枚举成员的静态字段。还有一个实例字段名称 value__ 存储枚举值。关键是这仅存在于枚举值的盒装版本中。
由于我们的解决方案返回一个object类型的值,有人会想修改@JaredPar的答案如下
Object value = (object)LongEnum.min;
Console.WriteLine(value);
Run Code Online (Sandbox Code Playgroud)
尽管如此,那只会打印成员name min
。
归档时间: |
|
查看次数: |
41364 次 |
最近记录: |