Como transformar string em enum em C#: do iniciante ao profissional
Todo desenvolvedor C#, mais cedo ou mais tarde, enfrenta a situação de precisar transformar uma string comum em uma enumeração (enum). Você recebe dados de JSON, lê configurações de um arquivo de configuração ou recebe um comando do usuário — e aí está uma string, enquanto o código espera um enum. Sem a conversão correta, você corre o risco de obter uma exceção ou, pior ainda, um erro imperceptível na lógica.
Neste artigo, abordaremos a conversão de string para enum em C#, desde métodos simples até técnicas avançadas. Você aprenderá como fazer parsing seguro de strings, tratar erros e escrever código elegante. O material é baseado em perguntas reais do Stack Overflow — o tópico acumulou milhares de visualizações por um motivo.
Vamos nessa!
Por que converter string para enum é uma tarefa comum
Enumerações em C# são uma ferramenta poderosa para criar código legível e type-safe. Mas o mundo externo geralmente trabalha com strings: APIs retornam "Admin", usuários digitam "readonly", bancos de dados armazenam "Pending". Para conectar esses mundos, é necessária a conversão de string para enum C#.
Vamos considerar cenários típicos:
- Desserialização de JSON — o campo de status chega como string
- Parsing de argumentos de linha de comando
- Leitura de configurações do appsettings.json
- Processamento de entrada do usuário em formulários web
Sem a abordagem correta, você terá uma exceção ou bugs difíceis de detectar. Vamos explorar as ferramentas disponíveis.
Método básico: Enum.Parse — rápido e simples
A maneira mais conhecida de converter string para enum em C# é o método Enum.Parse. Ele existe desde as primeiras versões do .NET e ainda é amplamente utilizado.
using System;
public enum UserRole{ Admin, Moderator, User, Guest}
class Program{ static void Main() { string input = "Admin"; UserRole role = (UserRole)Enum.Parse(typeof(UserRole), input); Console.WriteLine(role); // Saída: Admin }}Aqui, fazemos um cast explícito do resultado para o tipo desejado, pois Enum.Parse retorna um object. O método diferencia maiúsculas de minúsculas: a string "admin" geraria uma exceção. Se você não tiver certeza sobre a capitalização, adicione um terceiro parâmetro:
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), input, ignoreCase: true);Agora, "admin", "ADMIN" e até "AdMiN" serão convertidos corretamente. Mas há um detalhe: se a string não corresponder a nenhum valor do enum, você receberá um ArgumentException. E isso significa que o programa irá falhar.
Quando Enum.Parse é uma má escolha
- Você não controla os dados de entrada (entrada do usuário)
- A string pode ser null ou vazia
- Você deseja evitar exceções
Para esses casos, foi criado o Enum.TryParse.
Abordagem segura: Enum.TryParse — sem exceções
Enum.TryParse em C# é seu salva-vidas. Ele não lança exceções, mas retorna um bool: true se a conversão for bem-sucedida e false caso contrário.
string input = "Moderator";if (Enum.TryParse(input, ignoreCase: true, out UserRole result)){ Console.WriteLine($"Função: {result}");}else{ Console.WriteLine("Não foi possível reconhecer a função");}Observe: TryParse é um método genérico, portanto não é necessário fazer cast do resultado. O parâmetro ignoreCase funciona da mesma forma que no Parse. Este método é ideal para parsing seguro de enum em C#.
Mas há uma armadilha: TryParse considera bem-sucedido o parsing de strings numéricas. A string "42" será convertida para o valor do enum com equivalente numérico 42, mesmo que esse valor não exista. Para evitar isso, adicione