2011-02-11 52 views
10

比方說,我有這樣的枚舉:如何讓複雜的枚舉值的字符串表示

[Flags] 
public enum SomeType 
{  
    Val1 = 0, 
    Val2 = 1, 
    Val3 = 2, 
    Val4 = 4, 
    Val5 = 8, 
    Val6 = 16, 
    All = Val1 | Val2 | Val3 | Val4 | Val5 | Val6 
} 

和一些變量:

SomeType easyType = SomeType.Val1 | SomeType.Val2; 
SomeType complexType = SomeType.All; 

如果我要遍歷第一個枚舉我可以簡單的價值這樣做:

foreach(string s in easyType.ToString().Split(',')) 
{ ... } 

然而,當我嘗試同樣的方法適用於「複雜類型」我得到的值「所有」,這當然是因爲它也是枚舉的可能值之一。但是,有沒有一種方法可以真正看到SomeType.All創建的值是什麼?我知道我可以通過像所有的值進行手動循環:

if(complexType.HasFlag(ManualType.Val1) && ... 
+0

我認爲問題是,你不應該把`這裏面枚舉All`。既然你把它標記爲[[Flags]`,那麼把它組合在一起是一個壞主意。 – 2011-02-11 12:11:56

+0

然後我(和其他人)必須始終記住在使用SomeType進行某些操作時使用適當的枚舉組合。 – IamDeveloper 2011-02-11 12:12:57

+0

你可以發佈原始枚舉而不是毫無意義的`SomeType`嗎? – 2011-02-11 12:13:50

回答

4
var result = string.Join(",", 
       Enum.GetValues(typeof(SomeType)) 
        .Cast<SomeType>() 
        .Where(v => complexType.HasFlag(v))); 

你可以寫一個擴展避免重複自己的方法。

0

也許你需要枚舉枚舉值和測試每一個:

foreach (SomeType item in Enum.GetValues (typeof (SomeType)) 
{ 
    if ((complexType & item) == item) 
    { 
    //... 
    } 
} 
0

這裏是一個可能的方式做到這一點,建立在丹尼陳的回答是:

public IEnumerable<T> GetFlags<T>(Predicate<int> hasFlag) 
{ 
    return GetEnumFlags<T>().Where(f => hasFlag(f)).Cast<T>(); 
} 

private IEnumerable<int> GetEnumFlags<T>() 
{ 
    return Enum.GetValues(typeof(T)).Cast<int>().Where(IsPowerOfTwoOrZero); 
} 

private bool IsPowerOfTwoOrZero(int v) 
{ 
    return ((v & (v-1)) == 0); 
} 

用法:

void Main() 
{ 
    SomeType easyType = SomeType.Val1 | SomeType.Val2; 
    SomeType complexType = SomeType.All; 

    GetFlags<SomeType>(v => easyType.HasFlag((SomeType)v)); 
    GetFlags<SomeType>(v => complexType.HasFlag((SomeType)v)); 
} 

注意這會爲枚舉基於類型強制轉換爲int工作。您可以爲long等創建類似的方法。

0

如果您使用枚舉來表示具有更深層複雜性(任意組的元素,「顏色的黑暗」等)的數據並因此而掙扎,我建議枚舉是使用錯誤的編程結構。

對這些任務使用枚舉總是容易出錯:如果我爲枚舉添加一個新的顏色,我必須記得將它添加到「明亮」或「黑暗」。這使得你的代碼就像原始問題一樣容易出錯。但是,可能會做的是定義classstruct的顏色,該顏色具有指示其是否亮的屬性。然後,您將擁有清晰,可理解的功能 - 以不會導致錯誤結果的方式實施,就像您嘗試濫用更簡單的語言功能時一樣。

,例如,這就是爲什麼Color is a struct ...