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

Dav*_*ale 35 c# enums

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

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

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

我敢肯定必须有比这更好的方法.

Grz*_*nio 31

好问题!

我想不出更好的事情:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是相同的单行版本:`Enum.GetValues(typeof(Roles)).Cast <Roles>().Where(r =>(role&r)== r).Select(r => r.的ToString())` (15认同)
  • 最好用`(role&r)== r`或.net4中的`role.HasFlag(r)`替换`(role&r)!= 0`.并确保您指定的幂为2的幂,否则将失败.请参阅http://stackoverflow.com/questions/8447/enum-flags-attribute (9认同)
  • 另外,而不是if((role&r)!= 0)使用role.HasFlag(r) (3认同)

Mic*_*uno 27

如果你真的只是想要字符串,就不会比以前简单得多:

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();

  • 我迟到了,但你也可以用“,”分割,中间有空格,那么结果中会省略空格。 (2认同)

Ale*_*ven 7

Enum.Parse将处理ToString输出的连接值就好了.使用立即窗口证明:

? System.Enum.Parse(typeof(System.AttributeTargets), "Class, Enum")
Class | Enum
Run Code Online (Sandbox Code Playgroud)

(第二行是输出,它在调试器/即时窗口中与通用Enum.ToString()输出不同).