使用C#Enum标志根据其位智能值返回一组值

Ric*_*ick 5 c# enums enum-flags visual-studio-2015

我知道你可以用这种方式配置C#enum标志:

    [Flags]
    public enum MyEnum
    {
        Unknown = 0,
        Type1 = 1,
        Type2 = 2,
        Type3 = 4,
        Type4 = 8,
        Type5 = 16
    }
Run Code Online (Sandbox Code Playgroud)

一旦配置完毕,您就可以代表一组这样的枚举:

MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2
Run Code Online (Sandbox Code Playgroud)

然后,您可以对此集进行检查,例如:

if(enumerationSet.HasFlag(MyEnum.Type1))
{
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

或者打印他们的值,如下:

Console.WriteLine("{0}", enumerationSet);
Run Code Online (Sandbox Code Playgroud)

哪个会打印:

Type1, Type2
Run Code Online (Sandbox Code Playgroud)

但是,我可以按相反顺序进行吗?例如,如果我知道的话

MyEnum.Type1 | MyEnum.Type2 == 3
Run Code Online (Sandbox Code Playgroud)

那我可以问MyEnum一下它的价值/类型是什么等于3?然后,我可以创建一个扩展方法(GetSet)来执行如下:

List<MyEnum> myEnumSetList = MyEnum.GetSet(3)
Run Code Online (Sandbox Code Playgroud)

返回一MyEnum组或一组值,即{1, 2}.

请指教.


编辑:我终于搞清楚了.在下面发表我的答案.

Ric*_*ick 0

经过一些修改后,我能够根据相应集合的值或运算来解析枚举值列表:

protected List<MyEnum> GetEnumSet(int flagNumber)
{
      List<MyEnum> resultList= new List<MyEnum>();

      foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
      {
         if (((MyEnum)flagNumber).HasFlag(value))
         {
             resultList.Add(value);
         }
      }

      return resultList;
}
Run Code Online (Sandbox Code Playgroud)

这里,flagNumber是各个列表的值 OR'ed,即 MyEnum.Type1 | MyEnum.Type2。因此,通过发送此方法flagNumber,我得到了列表{ MyEnum.Type1, MyEnum.Type2 }