循环遍历“选定的”枚举值

本文关键字:选定的 枚举 遍历 循环 | 更新日期: 2023-09-27 18:32:04

我知道如何遍历枚举属性列表,但是我将如何遍历所有"选定的"枚举属性?例如,如果一个人Prop1 | Prop2反对public enum Foo { Prop1; Prop2; Prop3 },我将如何实现这一目标?

这就是我现在拥有的:

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

它遍历所有枚举属性,但我想只循环"选择"的属性。

更新:已设置[Flags]属性。

更新 2:枚举包含大量属性,我不能也不会键入/硬编码单个属性检查,而是我想动态循环遍历每个属性并检查我的枚举实例Bar是否包含循环项集。

循环遍历“选定的”枚举值

以下情况如何:

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));
[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();
    }
}

假设您将此设置为位掩码,那么只需"and"-ing 值即可确定选择哪些值。

 SomeEnum bitmask = value;
 if(bitmask & SomeEnum.Value1 > 0)
    // SomeEnum.Value1 was set
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.
  }
}
您需要

使用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
    }
}