2012-04-24 61 views
11

我知道如何遍歷枚舉屬性列表,但我將如何遍歷所有「選定」枚舉屬性?例如,如果Prop1 | Prop2public enum Foo { Prop1; Prop2; Prop3 }對應,我該如何實現?循環「selected」Enum值?

這是我現在有:

var values = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>(); 
foreach (var value in values) 
{ 
} 

遍歷所有的枚舉屬性,但我想僅環被「選中」的人。

更新:[Flags]屬性已設置。

更新2:枚舉包含大量的屬性,我不能也不會鍵入/硬編碼一個屬性檢查,而是我想要動態地循環每個屬性,並檢查我的枚舉實例Bar是否包含循環項目集。

+0

你粘的FlagsAttribute上枚舉? – scottheckel 2012-04-24 17:59:56

+0

@Hexxagonal:沒關係。但是,顯式賦值非常重要。 – 2012-04-24 18:00:38

+0

@Hexxagonal這真的比任何東西都更可選。枚舉可能是也可能不是每個都是兩個的權力。是否旗幟att。設置*應該*重要,但實際上它不。 – Servy 2012-04-24 18:00:44

回答

23

如何如下:

FileStatus status = FileStatus.New|FileStatus.Amazing; 

foreach (FileStatus x in Enum.GetValues(typeof(FileStatus))) 
{ 
    if (status.HasFlag(x)) Console.WriteLine("{0} set", x); 
} 

或者在一個下跌一舉LINQ:

var flags = Enum.GetValues(typeof(FileStatus)) 
       .Cast<FileStatus>() 
       .Where(s => status.HasFlag(s)); 
+0

+1,我同意,只有在設置標誌時纔會打印。 – Tejs 2012-04-24 18:08:16

+0

奇妙地工作! 'if'只在環狀枚舉屬性設置爲狀態時纔會通過! – Tower 2012-04-24 18:15:17

3

假設您將此設置爲位掩碼,那麼只需「和」 - 值將決定選擇哪一個。

SomeEnum bitmask = value; 

if(bitmask & SomeEnum.Value1 > 0) 
    // SomeEnum.Value1 was set 
+3

'bitmask.HasFlag(SomeEnum.Value1)'更具可讀性並且做同樣的事情 – 2012-04-24 18:02:55

+0

好點!儘管如此,爲了完整起見,很好理解到底是在做什麼。 – Tejs 2012-04-24 18:04:32

1
FileStatus someValue = ...; 
var selectedValues = new List<FileStatus>(); 
var allValues = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>(); 
foreach (var value in allValues) 
{ 
    if(someValue & value != 0)//note bitwise AND, not logical AND. 
    { 
    selectedValues.Add(value); 
    //this value is selected. You can stick it in a List or do whatever with it. 
    } 
} 
0

您需要與Flags屬性標記枚舉。爲了讓您可以使用yourObject.EnumProperty.HasFlag方法的值,例如:

class Program 
{ 
    [Flags] 
    public enum Bar { Prop1, Prop2, Prop3 } 

    public class Foo 
    { 
     public Bar SelectedBar { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var foo = new Foo(); 
     foo.SelectedBar = Bar.Prop1 | Bar.Prop2; 

     foo.SelectedBar.HasFlag(Bar.Prop1); //true 
     foo.SelectedBar.HasFlag(Bar.Prop2); //true 
     foo.SelectedBar.HasFlag(Bar.Prop3); //false 
    } 
} 
3
[Flags] 
public enum Foo 
{ 
    Prop1 = 1, 
    Prop2 = 1 << 1, 
    Prop3 = 1 << 2 
} 

public static class FooExtensions 
{ 
    private static readonly Foo[] values = (Foo[])Enum.GetValues(typeof(Foo)); 

    public static IEnumerable<Foo> GetComponents(this Foo value) 
    { 
     return values.Where(v => (v & value) != 0); 
    } 
} 

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     var foo = Foo.Prop1 | Foo.Prop3; 

     var components = foo.GetComponents().ToArray(); 
    } 
}