代码之家  ›  专栏  ›  技术社区  ›  David Neale

将标记枚举解析为列表的最有效方法

  •  34
  • David Neale  · 技术社区  · 14 年前

    我有一个标记的枚举,需要检索它上设置的所有值的名称。

    我目前正在利用枚举的toString()方法,该方法返回逗号分隔的元素。

        public void SetRoles(Enums.Roles role)
        {
            IList<Entities.Role> roleList = role.ToString("G").Split(',')
                .Select(r => new Entities.Role(r.Trim()))
                .ToList();
        ...
        }
    

    我相信一定有比这更好的方法。

    4 回复  |  直到 11 年前
        1
  •  27
  •   Grzenio    14 年前

    好问题!

    我想不出比这更好的了:

    public void SetRoles(Enums.Roles role)
    {
      List<string> result = new List<string>();
      foreach(Roles r in Enum.GetValues(typeof(Roles))
      {
        if ((role & r) != 0) result.Add(r.ToString());
      }
    }
    
        2
  •  25
  •   Mick Bruno    11 年前

    如果你真的只想要弦,就不能简单得多:

    string[] flags = role.ToString().Split(',');

    这比使用LINQ简单,而且仍然只是一行代码。 或者,如果您想要一个列表而不是一个数组(如问题中的示例所示),您可以将该数组转换为一个列表:

    List<string> flags = new List<string>(role.ToString().Split(','));

    在我的例子中,我需要一个通用的解决方案,并提出了这个:

    value.ToString().Split(',').Select(flag => (T)Enum.Parse(typeof(T), flag)).ToList();

        3
  •  7
  •   Alex Paven    14 年前

    parse将处理ToString输出的连接值,这很好。使用即时窗口证明:

    ? System.Enum.Parse(typeof(System.AttributeTargets), "Class, Enum")
    Class | Enum
    

    (第二行是输出,与一般的enum.toString()输出在Debugger/immediate窗口中不同)。

        4
  •  4
  •   Darin Dimitrov    14 年前

    你为什么需要一个清单?所有内容都已存储在标志中:

    [Flags]
    enum Roles
    {
        Read = 0x1,
        Write = 0x2,
        Delete = 0x4,
    }
    

    然后分配角色:

    var roles = Roles.Read | Roles.Write;
    

    每当需要检查给定角色是否存在时,不需要查看列表,只需查看角色枚举:

    if ((roles & Roles.Read) == Roles.Read)
    {
        // The user has read permission
    }
    if ((roles & Roles.Write) == Roles.Write)
    {
        // The user has write permission
    }