2011-02-11 50 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 ...