Прокрутите "выбранные" значения Enum?
Я знаю, как перебирать список перечислений свойств, но как бы я перебирал все "выбранные" свойства enum? Например, если вы сделали Prop1 | Prop2
против public enum Foo { Prop1; Prop2; Prop3 }
, как бы я это сделал?
Это то, что у меня есть сейчас:
var values = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>();
foreach (var value in values)
{
}
Он перебирает все свойства enum, но я хотел бы зацикливать только те, которые были выбраны.
Обновление: был установлен атрибут [Flags]
.
Обновление 2: перечисление содержит большое количество свойств, я не могу и не буду вводить/жестко кодировать одну проверку свойства, вместо этого я хочу динамически прокручивать каждую из них и проверять, был ли мой экземпляр enum Bar
содержит набор элементов с петлями.
Ответы
Ответ 1
Как насчет следующего:
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));
Ответ 2
Предполагая, что этот набор задан как битовая маска, тогда просто "и" -значения будут определять, какие из них выбраны.
SomeEnum bitmask = value;
if(bitmask & SomeEnum.Value1 > 0)
// SomeEnum.Value1 was set
Ответ 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();
}
}
Ответ 4
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.
}
}
Ответ 5
Вам нужно будет пометить enum атрибутом 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
}
}