如何在case語句中使用C#枚舉值的字符串值?

我已將C#枚舉定義為

public enum ORDER
{
    ...
    unknown,
    partial01,
    partial12,
    partial23,
}

并可以將其值用作字符串,如下所示:

            string ss = ORDER.partial01.ToString();

但是,當我嘗試在case語句中使用它時,它無法編譯:

string value = ...
switch (value)
{
    case null:
        break;
    case "s":
          
asked 2020-02-22T16:55:34Z
12個解決方案
90 votes

從C#6開始,您可以使用:case nameof(SomeEnum.SomeValue):

Nameof是在編譯時求值的,簡單地是一個與給定變量,類型或成員的(非限定)名稱匹配的字符串。 當然,如果您重命名枚舉選項名稱,它也會隨之更改。

answered 2020-02-22T16:56:07Z
44 votes

將開關中的字符串轉換為枚舉值。

(ORDER)Enum.Parse(typeof(ORDER), value, true);
answered 2020-02-22T16:56:27Z
30 votes

作為使用T Enum.Parse<T>(string value)的替代方法,您可以先將字符串轉換為enum。 但是,如果選項的數量很少,可能就沒有多大意義:

if (Enum.IsDefined(typeof(ORDER), value))
{
    switch ((ORDER)Enum.Parse(typeof(ORDER), value)
    {
        case ORDER.partial01:
           
answered 2020-02-22T16:56:52Z
26 votes

枚舉是一個常量可以领救济金的游戏,但是.ToString()的結果不是。 就編譯器而言,它是一個動態值。 您可能需要將切換用例轉換為一系列if / else語句

answered 2020-02-22T16:55:42Z
12 votes

您出于某種原因將其設計為枚舉,但實際上并沒有真正將其用作枚舉。 為什么要采用枚舉值并將其轉換為字符串然后在開關中使用,而不是簡單地使用枚舉?

您說您無法將其解析為枚舉,因為某些值超出了枚舉范圍。 然后要問的問題是:“為什么?” 如果允許未定義的值,那么擁有枚舉有什么意義? 當您獲得未定義的值時,您想發生什么? 如果對于任何未定義的值都是相同的,則可以使用默認大小寫。 如果不是,則可以包括與數字表示形式匹配的其他情況。

如果確實返回了字符串,那么您可能不想使用枚舉。 相反,您想創建一個包含公共字符串常量的公共靜態類,然后可以在開關中使用它。 這里的技巧是,評估將以區分大小寫的方式進行。

public static class Order
{
   public const string Unknown = "Unknown";
   public const string Partial01 = "Partial01";
   public const string Partial12 = "Partial12";
   public const string Partial23 = "Partial23";
}
string value = Order.Partial01
switch (value)
{
   case Order.Partial01:
      break;
    default:
      
answered 2020-02-22T16:57:29Z
5 votes

如Thorarin所述,如果您的switch語句只能包含enum個案例,請先將您的string轉換為enum。 至少從.Net framework 4開始,您可以使用此處定義的2759062921417317327620方法,并執行以下操作:

ORDER orderEnum = ORDER.unknown;
Enum.TryParse<ORDER>(value, out orderEnum);
switch (orderEnum)
{
    case ORDER.unknown:
       
answered 2020-02-22T16:57:50Z
2 votes

枚舉值是常量,但是您嘗試使用方法(ORDER.partial01.ToString())的結果,而不是常量。

我認為的選擇是將其切換為使用if / else if / else語句,而不是進行切換。 這將允許您使用所需的邏輯。

另外,如果將字符串切換為枚舉值,則可以直接打開枚舉值。 但是,您無法通過一個開關打開enum + null +其他字符串。

answered 2020-02-22T16:58:20Z
1 votes

你不能只是說

case "partial01":

?

answered 2020-02-22T16:58:44Z
1 votes

枚舉是常量可以领救济金的游戏,但是ToString()是返回值的函數。 根據枚舉對象的實例被調用。

這是兩個語句:

ORDER.partial01.ToString()
ORDER.partial02.ToString()

調用相同的函數,但返回兩個不同的值,因此對函數.ToString()的調用本身不是常數。

answered 2020-02-22T16:59:14Z
1 votes

就編譯器而言,這不是靜態值,因為它是一個函數調用:

ORDER.partial01.ToString()

因此,您不能將其用作case語句中的比較。 但是,您可以簡單地執行以下操作:

case "partial01"

這將起作用,因為枚舉值和字符串相同。

answered 2020-02-22T16:59:43Z
0 votes

只需定義一個全局變量

static ORDER orderstr;

現在您可以在頁面中的任何地方設置值orderstr

public enum ORDER
{ 
    unknown,
    partial01,
    partial12,
    partial23,
}
switch (orderstr)
{
    case Order.Partial01:
        break;
    default:
        break;
}
answered 2020-02-22T17:00:07Z
0 votes

使用擴展

      public static string ToGender(this Gender enumValue)
        {
            switch (enumValue)
            {
                case Gender.Female:
                    return "Female";
                case Gender.Male:
                    return "Male";
                default:
                    return null;
            }
        }

Gender.Male.ToGender();
answered 2020-02-22T17:00:31Z
translate from