2013-01-21 69 views
2

我知道在.NET 4中,您可以使用HasFlag如何迭代.NET中的「set」枚舉C#3.5

.NET 3.5中有以下替代方法嗎?

if ((enumVar & EnumType.ValueOne) == EnumType.ValueOne) 
{ 
    // someMethod(1) or someMethod(EnumType.ValueOne) 
} 
if ((enumVar & EnumType.ValueTwo) == EnumType.ValueTwo) 
{ 
    // someMethod(2) or someMethod(EnumType.ValueTwo) 
} 
if ((enumVar & EnumType.ValueThree) == EnumType.ValueThree) 
{ 
    // someMethod(3) or someMethod(EnumType.ValueThree) 
} 
if ((enumVar & EnumType.ValueFour) == EnumType.ValueFour) 
{ 
    // someMethod(4) or someMethod(EnumType.ValueFour) 
} 

...等等的枚舉中的每個值?你必須能夠使用for..each循環來完成這一點someMethod的參數是循環的索引?

[Flags] 
enum EnumType 
{ 
    ValueOne = 1 
    , ValueTwo = 2 
    , ValueThree = 4 
    , ValueFour = 8 
} 

編輯:唯一值得看接受的答案,評論其餘/答案可以安全地忽略。

+0

爲什麼不直接使用一個開關/ case語句? – Chris

+0

所以你承認它不能在循環中完成? –

+0

你沒有使用循環youre使用if ... – RhysW

回答

5

你應該可以寫這樣的東西。如果需要,可以將其設爲通用的,但是無法將約束設置爲枚舉,因此您必須使用反射來檢查自己。

public static bool HasFlag(YourEnum source, YourEnum flag) 
{ 
    return (source & flag) == flag; 
} 
+2

慚愧的是,我猜它爲什麼hasFlag被引入 –

+2

@GregT如果你「作弊」,你可以限制爲一個枚舉。請參閱[另一個線索中的另一個答案](http://stackoverflow.com/a/1409873/1336654)項目Unconstrained Melody鏈接。 –

0

你可以做這樣的事情做EnumType

foreach (EnumType enumType in Enum.GetValues(typeof(EnumType))) 
{ 
    if (enumType.HasFlag(enumType)) 
    { 
     Console.WriteLine(enumType.ToString()); 
    } 
} 

這將返回ValueOne,ValueTwo,ValueThree的foreach循環..蝕刻 不知道這是你在找什麼,請測試和讓我和其他人一樣知道

+0

這並不檢查枚舉值是否被設置? –

+1

您可以在該循環中添加條件語句我希望我正確理解您的問題..如果您喜歡 – MethodMan

+0

,您還可以添加一個Switch語句,您可以提供示例代碼嗎?它不能使用HasFlag,因爲這是.NET 3.5 –

0
switch enumvar 
{ 
case valueOne: 
{ 
//do some thing 
breake; 
} 
case valuetwo: 
{ 
//do some thing else 
break; 
} 
default: 
break; 
    } 
+0

我要求它在循環內完成? –

3
foreach (EnumType enumType in Enum.GetValues(typeof(EnumType))) 
{ 
    if(enumVar.HasFlag(enumType)) 
    { 
     Console.WriteLine(enumTpye.ToString()); 
    } 
} 
+0

我曾說過不要使用HasFlag - 這是.NET 3.5 –

+0

道歉 - 沒有讀到。在這種情況下,您需要使用&運算符。 – Matt

+0

但可以在循環內完成嗎? –