2011-04-16 51 views
0

給定一個枚舉類型:如何在C#中打開具有重複值或布爾值的枚舉?

enum SOMEENUM 
{ 
    A = true, 
    B = false, 
    C = true 
} 

我想switch這個像:

public void SWITCHON (SOMEENUM sn) 
{ 
    switch(s) 
    { 
     case SOMEENMUM.A : xxxxxxxx....... 
    } 
} 

但是,這並不編譯;我想這是使用enum的值bool

我想打開Enum,好像沒有賦值給它。

+0

爲什麼形式參數「sn」但開關控制器是「s」?這是一個錯字,還是你打算他們不同? – 2011-04-16 14:53:17

回答

0

枚舉需要數值但不必設置。我建議只刪除離開它像

enum SOMEENUM 
{ 
    A, 
    B, 
    C 
} 

所以

public void SWITCHON (SOMEENUM s) 
{ 
    switch(s) 
    { 
     case SOMEENMUM.A : ...do stuff... 
      break; 
     case SOMEENMUM.B : ...do stuff... 
      break; 
     case SOMEENMUM.c : ...do stuff... 
      break; 
    } 
} 
+2

我堅信所有的價值觀(明智的獨特價值),如果訂單發生變化等,有助於減少合同中的突然變化。 – 2011-04-16 05:54:37

+1

這不適用於標題中具體提及的那些枚舉類型:那些重複的價值。你錯過了整個問題的關鍵,同時提出了糟糕的設計。 – 2011-04-16 06:12:07

2

重複值是同樣的事情只是叫法不同。沒有辦法區分這種差別,因爲枚舉是作爲值存儲的,而不是名稱。

至於bool值,您使用if而不是switch

3

首先:
C#中的枚舉值不支持bool值。 所以它應該是整數。 如果我們將枚舉的2個屬性設置爲相同的值,我們可以認爲其中一個丟失了。 從我的理解你實際上正在試圖做的是: 不知何故標誌着枚舉的2個屬性是平等的。
我的建議:

public enum MyEnum 
{ 
    [Description("true")] 
    A = 1, 
    [Description("false")] 
    B = 2, 
    [Description("true")] 
    C = 3 
} 

擴展枚舉將返回布爾

public static class EnumEx 
    { 
     public static bool GetDescriptionAsBool(this Enum value) 
     { 
      FieldInfo field = value.GetType().GetField(value.ToString()); 
      DescriptionAttribute attribute 
        = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) 
         as DescriptionAttribute; 
      if(attribute == null) 
      { 
       //throw new SomethingWentWrongException(); 
      } 
      return bool.Parse(attribute.Description); 
     } 
    } 

您能正常切換的結果,並隨時可以檢查你有什麼枚舉鈴標誌只是打電話的GetDescriptionAsBool方法那個例子。

+1

我建議你使用DefaultValueAttribute類來代替,使用true或false作爲默認值,這樣就可以輸入並添加一些語義信息。或者你也可以想出一個特定的屬性,這可能是最好的。 – 2011-04-16 08:23:02

+0

我同意,但我發佈這只是爲了指出如何解決目前的問題。感謝您的更好的實施。 – Sonosar 2011-04-16 09:13:51

+0

我現在正在使用SYSTEM.ATTRIBUTE權限。謝謝。 – karl 2011-04-16 22:06:52