2017-06-09 42 views
0

我面臨與C#中的枚舉的問題。枚舉問題相同的ID和不同的描述

我有enum數據具有相同的id但不同的描述。

public enum Flags 
{ 
    [Description("Flag Yes")] 
    FlagYes=1, 
    [Description("Flag No")] 
    FlagNo=1, 
    [Description("Item Yes")] 
    ItemYes=2, 
    [Description("Item No")] 
    ItemNo=2, 
} 

Flags flag = Flags.FlagYes; 
string Description = flag.Description(); 

我在裏面Description值「國旗號」,但我需要「國旗是」。任何幫助我如何解決這個問題?

我使用下面的通用代碼獲取來自enum的描述。

public static string Description(this Enum Value) 
{ 
    FieldInfo field = Value.GetType().GetField(Value.ToString()); 
    DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
    return attribute == null ? Value.ToString() : attribute.Description; 
} 

任何解決方案,請讓我知道嗎?

+0

如何修復你的枚舉對所有選項有不同的值? – Evk

+0

@Evk, 我需要解決方案才能從枚舉方案中獲取「標記是」說明。 –

+0

那麼你不能那樣做,因爲枚舉在內部只是一個數字。 – Evk

回答

0

正如其他人說什麼目前你正在做是不可能的,你不能有兩個標誌使用相同的整數值,然後嘗試對其進行區分

另一種方法是枚舉改變你有額外的價值分組其他值加在一起:

public enum Flags 
{ 
    [Description("Flag Yes")] 
    FlagYes = 1, 
    [Description("Flag No")] 
    FlagNo = 2, 
    [Description("Item Yes")] 
    ItemYes = 4, 
    [Description("Item No")] 
    ItemNo = 8, 
    IsFlag = (FlagYes | FlagNo), //group Flag values 
    IsItem = (ItemYes | ItemNo) //group Item values 
} 

然後,您可以檢查枚舉是一個標誌或項目是這樣的:

public bool IsFlag(Flags a) 
{ 
    return (Flags.IsFlag.HasFlag(a)); 
} 

public bool IsItem(Flags a) 
{ 
    return (Flags.IsFlag.HasFlag(a)); 
} 

更新

正如其他人已經解釋了Enum的基礎類型是int值。所以即使在你的代碼中,你說的是FlagYes它是通過該方法的值1。您的代碼然後查找值1並找到FlagsNo。 數字1不能同時代表FlagsYesFlagNo

如果你需要你的枚舉值爲1和2,但也需要FlagsYes和FlagsNo你有兩個獨立的問題,需要創建一個不同的解決方案。

如果FlagsYesFlagsNo的值是任意的並且可以是任何值,只要它們相同,那麼您可以根據上面的代碼創建組枚舉值。

+0

在枚舉中不需要相同的ID。 –

+0

因爲我使用了一些過濾器計算,所以它需要相同的標識類型ID是/否和項目是/否 –

+0

什麼意思是我的一些過濾器計算他們必須是相同的還是他們必須是1和2?這聽起來像你想讓Flags枚舉服務於兩種不同的需求。如果沒有更多關於如何使用枚舉的上下文,我不確定任何人都可以提供幫助。 – Scrobi

2

您在enum中有4個值,但只有兩個「真實」值。
所以你的問題發佈enum實際上更可能等於是這樣的:

public enum Flags 
{ 
    [Description("Flag No")] 
    FlagNo=1, 
    [Description("Item No")] 
    ItemNo=2, 
} 

使用FlagYesItemYes因爲他們也被定義,但相同的值來訪問FlagNoItemNo的能力。

爲了解決你的問題,你必須解決您的enum看起來像這樣:根據意見

public enum Flags 
{ 
    [Description("Flag Yes")] 
    FlagYes=1, 
    [Description("Flag No")] 
    FlagNo=2, 
    [Description("Item Yes")] 
    ItemYes=3, 
    [Description("Item No")] 
    ItemNo=4, 

}

編輯:

我「標誌不「,但我需要」標記是「。任何幫助我如何解決這個問題?

要回復到您的評論,如果你有一個真正強大的原因,你想有相同的ID爲什麼,我建議以及有兩個enum,一個用於和一個用於沒有,你使用它的方式:

Flags flag = Flags.FlagYes; 
string Description = flag.Description(); 

不會讓「代碼」神奇地知道給你這說明,所以如果你想,這裏的另一種方法做有相同的ID它有兩個enum

public enum YesFlags 
{ 
    [Description("Flag Yes")] 
    FlagYes=1, 
    [Description("Item Yes")] 
    ItemYes=2 
} 

public enum NoFlags 
{ 
    [Description("Flag No")] 
    FlagNo=1, 
    [Description("Item No")] 
    ItemNo=2 
} 

然後,您可以使用所需的enum具有相同的ID。

+0

不,我需要相同的ID。 –

+0

@NeoVijay然後你用錯誤的方式使用枚舉。谷歌的一些教程和比較枚舉與類與結構 – Fabiano

+1

@NeoVijay在'C#中''enum'的默認底層數據類型是一個int,所以你真正想要的幾乎不可能或不可能。你不能有兩個相同的'id',把它看作是數據庫中唯一的主鍵,你不能有重複的鍵。枚舉是爲了枚舉。如果你有強烈的理由擁有相同的ID,我或者建議使用兩個'enum',或者根本不使用'enum'。 –

0

你想要什麼是不可能的。既然你們都將1賦值給兩個枚舉項,那麼就沒有辦法區分它們,因爲在內部只考慮了數值。

+0

謝謝,我除了是或否。 –

+0

但它編譯得很好。並且它在運行時不能有任何錯誤。並給出錯誤的返回 –

0

.NET中的枚舉基本上是一個整數,編譯器可以幫助您確保它只是之前選定的常量範圍之一。因爲枚舉是值類型,所以在運行時只有基礎編號。沒有額外的字段指定哪個常量是因爲這應該被編碼在該數字中。

然而,作爲數字,您可以使用所有的整數操作來處理枚舉操作,包括按位操作。您可能遇到的|操作者標記的枚舉結合,但是你也可以使用口罩:

public enum Flags 
{ 
    [Description("Flag Yes")] 
    FlagYes=1, 
    [Description("Flag No")] 
    FlagNo=5, 
    [Description("Item Yes")] 
    ItemYes=2, 
    [Description("Item No")] 
    ItemNo=6, 
    Mask=3 
} 

然後,您可以使用value & Flags.Mask恢復你的ID。但是,ItemNoFlagNo仍然可以區分。