Por que a pergunta "How can I enumerate an enum?" é tão popular?
\n\nSe você já programou em C# e lidou com enumerações (enum), certamente já se perguntou: "Como obtenho todos os valores deste enum?". Essa pergunta é um verdadeiro sucesso no Stack Overflow, acumulando milhares de visualizações. E não é surpresa: enumerar um enum é uma daquelas tarefas que parecem simples, mas sem conhecer a sintaxe correta, pode confundir até mesmo um desenvolvedor experiente.
Neste artigo, vamos analisar como listar corretamente todos os valores de um enum em C#, mostrar exemplos de código funcionais que você pode copiar diretamente para seu projeto e falar sobre as armadilhas. Vamos lá!
\n\nO que é um enum em C#? Um breve lembrete
\n\nEnum (enumeração) é um tipo de dado que permite definir um conjunto de constantes nomeadas. Por exemplo, dias da semana, status de pedidos ou tipos de erro. Em C#, um enum é declarado assim:
\n\npublic enum DayOfWeek\n{\n Monday,\n Tuesday,\n Wednesday,\n Thursday,\n Friday,\n Saturday,\n Sunday\n}\n\nCada elemento recebe, por padrão, um valor inteiro (começando em 0). Mas muitas vezes surge a necessidade de percorrer todos os elementos de um enum — por exemplo, para exibi-los em uma lista suspensa, criar um array ou verificar se um valor existe.
\n\nComo listar todos os valores de um enum: método básico
\n\nA maneira mais popular e simples é usar o método estático Enum.GetValues(). Ele retorna um array com todos os valores da enumeração especificada. Veja como funciona:
using System;\n\npublic class Program\n{\n public enum Status\n {\n New,\n InProgress,\n Completed,\n Cancelled\n }\n\n public static void Main()\n {\n // Obtém todos os valores do enum\n Status[] allStatuses = (Status[])Enum.GetValues(typeof(Status));\n\n // Percorre-os com foreach\n foreach (Status status in allStatuses)\n {\n Console.WriteLine(status);\n }\n }\n}\n\nResultado da execução:
\nNew\nInProgress\nCompleted\nCancelled\n\nObserve: fazemos uma conversão explícita para o array Status[], porque Enum.GetValues() retorna um Array (não tipado).
Alternativa: Enum.GetNames()
\n\nSe você precisa não dos valores em si, mas apenas de seus nomes em string, use Enum.GetNames():
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n Console.WriteLine(name);\n}\n\nO resultado será o mesmo, mas o tipo do elemento é string, não Status. Isso é útil ao trabalhar com interface do usuário ou serialização.
Abordagem moderna: versão genérica (C# 7.3+)
\n\nA partir do C# 7.3, temos uma maneira mais elegante — Enum.GetValues<T>(). Ela retorna um array do tipo específico, sem necessidade de conversão:
Status[] allStatuses = Enum.GetValues<Status>();\n\nforeach (Status status in allStatuses)\n{\n Console.WriteLine($"ID: {(int)status}, Name: {status}");\n}\n\nEste método é mais curto e mais seguro em termos de tipos. Se você usa uma versão moderna do C# (e deveria!), recomendo este.
\n\nExemplo da vida real: preenchendo uma lista suspensa
\n\nImagine que você está criando um aplicativo de gerenciamento de tarefas. Precisa mostrar ao usuário uma lista de status possíveis em um menu suspenso. Veja como fazer isso com enumeração de enum:
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class TaskManager\n{\n public enum TaskStatus\n {\n NotStarted,\n InProgress,\n WaitingForReview,\n Done\n }\n\n publ