列出标志Enum中的所有位名称

PPC*_*PPC 11 c# generics enums enumeration

我正在尝试创建一个帮助方法来列出Enum值中设置的所有位的名称(用于记录目的).我想要一个方法,它将返回一些变量中设置的所有枚举值的列表.在我的例子中

[Flag]
Enum HWResponse
{
   None = 0x0,
   Ready = 0x1,
   Working = 0x2,
   Error = 0x80,
}
Run Code Online (Sandbox Code Playgroud)

我喂它0x81,它应该为我提供一个IEnumerable<HWResponse>包含{Ready, Error}.

由于我没有找到更简单的方法,我尝试编写下面的代码,但我无法编译.

public static IEnumerable<T> MaskToList<T>(Enum mask) 
{
  if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
    throw new ArgumentException();

  List<T> toreturn = new List<T>(100);

  foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
  {
    Enum bit = ((Enum) curValueBit);  // Here is the error

    if (mask.HasFlag(bit))
      toreturn.Add(curValueBit);
  }

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

在这个版本的代码中,编译器抱怨它无法将T强制转换为Enum.

我做错了什么?有更好(更简单)的方法吗?我怎么能演员?

另外,我试着把方法写成

public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
Run Code Online (Sandbox Code Playgroud)

但Enum属于一种禁止'where'语法的特殊类型(使用C#4.0)

Gab*_*abe 21

这是使用LINQ编写它的简单方法:

public static IEnumerable<T> MaskToList<T>(Enum mask)
{
    if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
        throw new ArgumentException();

    return Enum.GetValues(typeof(T))
                         .Cast<Enum>()
                         .Where(m => mask.HasFlag(m))
                         .Cast<T>();
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案:简单,可读和简短.但有一个缺点:HasFlag(m)还列出状态'None'(0x0); 但它很容易通过旧式二进制文件克服 (2认同)

Pio*_*r P 1

我花了一些时间搜索如何将 Flags 枚举值转换为 List。我找到了非常简单的解决方案,也许会对某人有所帮助。

  [Flags]
  public enum Tag
  {
    None = 0,
    Stablecoin = 1,
    NativeTokens = 2,
    Dex = 4
}
Run Code Online (Sandbox Code Playgroud)
var values = Tag.Stablecoin | Tag.Dex;
var str = values.ToString(); //"Stablecoin, Dex"
var list = uniqueNftTagsV2.Split(", "); //{"Stablecoin","Dex"}
Run Code Online (Sandbox Code Playgroud)