簡體   English   中英

如何從枚舉中獲取數值?

[英]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

現在讓我們詳細說明一下這個......

Enum 的數值並不總是 int (!!!)

正如文檔中所解釋的,

每個枚舉類型都有一個對應的整數類型,稱為枚舉類型的基礎類型。 此基礎類型必須能夠表示枚舉中定義的所有枚舉器值。 枚舉聲明可以顯式聲明 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

打印正確的值!

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

為了回答這個問題,我將遵循@Hans Passant 的回答

JIT 編譯器需要一個值類型的定義來描述它被裝箱時的布局。 它們中的大多數都被烘焙到 mscorlib 中,如 System.Int32。 enum 關鍵字允許您創建新的值類型。 因此,編譯器必須在元數據中為其提供定義。 這就是你在看什么。 您將看到 ToString() 使用的每個枚舉成員的靜態字段。 還有一個實例字段名稱 value__ 存儲枚舉值。 關鍵是這僅存在於枚舉值的盒裝版本中。

PS...

由於我們的解決方案返回一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM