12

プロパティの列挙型リストをループする方法を知っていますが、すべての「選択された」列挙型プロパティをループする方法はありますか?たとえば、Prop1 | Prop2反対した場合、どうすればpublic enum Foo { Prop1; Prop2; Prop3 }これを達成できますか?

これは私が今持っているものです:

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

すべての列挙型プロパティをループしますが、「選択された」プロパティのみをループしたいと思います。

更新:[Flags]属性が設定されました。

更新2:列挙型には多数のプロパティが含まれています。単一のプロパティチェックを入力/ハードコーディングすることはできません。代わりに、各プロパティを動的にループして、列挙型インスタンスBarにループされたアイテムセットが含まれているかどうかを確認します。

4

5 に答える 5

27

次はどうですか:

FileStatus status = FileStatus.New|FileStatus.Amazing;

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

または、1つの落ちたLINQ急襲で:

var flags = Enum.GetValues(typeof(FileStatus))
                .Cast<FileStatus>()
                .Where(s => status.HasFlag(s));
于 2012-04-24T18:01:06.173 に答える
4
[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();
    }
}
于 2012-04-24T18:12:11.790 に答える
3

これをビットマスクとして設定していると仮定すると、値を単に「and」-入力すると、どちらが選択されるかが決まります。

 SomeEnum bitmask = value;

 if(bitmask & SomeEnum.Value1 > 0)
    // SomeEnum.Value1 was set
于 2012-04-24T17:58:35.720 に答える
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.
  }
}
于 2012-04-24T17:58:38.717 に答える
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
    }
}
于 2012-04-24T18:11:07.097 に答える