[英]How to get the numeric value from the Enum?
例如 System.Net.HttpStatusCode 枚舉,我想獲取 HTTP 狀態代碼而不是 HTTP 狀態文本。 System.Net.HttpStatusCode.Forbidden
應該返回 403 而不是“Forbidden”。
我怎樣才能提取價值?
對於大多數 Enum 只是簡單地轉換為 int32 的基本類型。
int value = (int)System.Net.HttpStatusCode.Forbidden;
您可以將其強制轉換為整數!
int code = (int)enumVariable
System.Convert.ToInt32(response.StatusCode) 返回 statusCode 編號
我認為@JaredPar的回答很好,但正如他自己解釋的那樣,它並不總是有效,所以我將在這里提供完整的答案。
而不是簡單地轉換,使用以下代碼
var value =
typeof(System.Net.HttpStatusCode)
.GetField("value__")
.GetValue(System.Net.HttpStatusCode.Forbidden);
Console.WriteLine(value); // 403
現在讓我們詳細說明一下這個......
正如文檔中所解釋的,
每個枚舉類型都有一個對應的整數類型,稱為枚舉類型的基礎類型。 此基礎類型必須能夠表示枚舉中定義的所有枚舉器值。 枚舉聲明可以顯式聲明 byte、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 的回答:
JIT 編譯器需要一個值類型的定義來描述它被裝箱時的布局。 它們中的大多數都被烘焙到 mscorlib 中,如 System.Int32。 enum 關鍵字允許您創建新的值類型。 因此,編譯器必須在元數據中為其提供定義。 這就是你在看什么。 您將看到 ToString() 使用的每個枚舉成員的靜態字段。 還有一個實例字段名稱 value__ 存儲枚舉值。 關鍵是這僅存在於枚舉值的盒裝版本中。
由於我們的解決方案返回一個object類型的值,有人會想修改@JaredPar的答案如下
Object value = (object)LongEnum.min;
Console.WriteLine(value);
盡管如此,那只會打印成員名稱min
。
您可以使用使用 .NET CLR 函數的 Principled 方式。
int value = System.Net.HttpStatusCode.Forbidden.GetHashCode();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.