加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从标志枚举中列出所有位名称

发布时间:2020-12-15 07:49:26 所属栏目:百科 来源:网络整理
导读:我试图制作一个帮助方法来列出在枚举值中设置的所有位的名称(用于记录目的).我想有一个方法可以返回在一些变量中设置的所有枚举值的列表.在我的例子中 [Flag]Enum HWResponse{ None = 0x0,Ready = 0x1,Working = 0x2,Error = 0x80,} 我给它0x81,它应该提供一
我试图制作一个帮助方法来列出在枚举值中设置的所有位的名称(用于记录目的).我想有一个方法可以返回在一些变量中设置的所有枚举值的列表.在我的例子中
[Flag]
Enum HWResponse
{
   None = 0x0,Ready = 0x1,Working = 0x2,Error = 0x80,}

我给它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;
}

在这个版本的代码中,编译器抱怨说它不能将T转换为Enum.

我做错了什么?有没有更好(更简单)的方法来做到这一点?我该怎么做演员?

另外,我试图把方法写成

public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum

但是Enum是一种特殊类型,禁止’where’语法(使用C#4.0)

解决方法

这是一个使用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>();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读