A maneira mais eficiente de analisar um enum sinalizado para uma lista

Eu tenho um enum sinalizado e preciso recuperar os nomes de todos os valores definidos nele.

Atualmente, estou aproveitando o método ToString () do enum, que retorna os elementos separados por vírgulas.

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

Tenho certeza de que deve haver uma maneira melhor do que isso.

Boa pergunta!

Eu não consigo pensar em nada melhor que:

 public void SetRoles(Enums.Roles role) { List result = new List(); foreach(Roles r in Enum.GetValues(typeof(Roles)) { if ((role & r) != 0) result.Add(r.ToString()); } } 

Se você realmente quer apenas as cordas, não pode ficar muito mais simples do que:

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

Isso é mais simples do que usar o LINQ e ainda é apenas uma única linha de código. Ou, se você quiser uma lista em vez de uma matriz, como na amostra da pergunta, você pode converter a matriz em uma lista:

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

No meu caso, eu precisava de uma solução genérica e descobri isso:

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

Enum.Parse irá manipular os valores concatenados gerados por ToString bem. Prova usando a janela Immediate:

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

(a segunda linha é a saída, que é diferente na janela depurador / imediata da saída genérica Enum.ToString ()).

Por que você precisa de uma lista? Tudo já está armazenado nas bandeiras:

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

Em seguida, atribua funções:

 var roles = Roles.Read | Roles.Write; 

E sempre que você precisar verificar se uma determinada function já foi necessária, não precisará procurar em uma lista, mas simplesmente procurar na enumeração de funções:

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