Cómo convertir una cadena en un enum en C#: de principiante a experto
Todo desarrollador de C# tarde o temprano se enfrenta a la situación de tener que convertir una cadena común en una enumeración (enum). Obtiene datos de un JSON, lee configuraciones de un archivo de configuración o recibe un comando de un usuario — y tiene una cadena, mientras que el código espera un enum. Sin una conversión adecuada, corre el riesgo de obtener una excepción o, peor aún, un error imperceptible en la lógica.
En este artículo, analizaremos la conversión de cadena a enum en C# desde métodos simples hasta técnicas avanzadas. Aprenderá cómo analizar cadenas de forma segura, manejar errores y escribir código elegante. El material se basa en preguntas reales de Stack Overflow — el tema ha acumulado miles de visitas por una razón.
¡Comencemos!
Por qué la conversión de cadena a enum es una tarea común
Las enumeraciones en C# son una herramienta poderosa para crear código legible y type-safe. Pero el mundo exterior generalmente trabaja con cadenas: las API devuelven "Admin", el usuario ingresa "readonly", la base de datos almacena "Pending". Para conectar estos mundos, se necesita la conversión de string a enum C#.
Consideremos escenarios típicos:
- Deserialización de JSON — el campo de estado llega como cadena
- Análisis de argumentos de línea de comandos
- Lectura de configuraciones desde appsettings.json
- Procesamiento de entrada de usuario en formularios web
Sin un enfoque correcto, obtendrá una excepción o errores difíciles de detectar. Analicemos las herramientas disponibles.
Método básico: Enum.Parse — rápido y sencillo
La forma más conocida de convertir una cadena en un enum en C# es el método Enum.Parse. Existe desde las primeras versiones de .NET y todavía se usa activamente.
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); // Salida: Admin }}Aquí convertimos explícitamente el resultado al tipo deseado, porque Enum.Parse devuelve un object. El método distingue entre mayúsculas y minúsculas: la cadena "admin" generará una excepción. Si no está seguro del uso de mayúsculas/minúsculas, agregue un tercer parámetro:
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), input, ignoreCase: true);Ahora "admin", "ADMIN" e incluso "AdMiN" se convertirán correctamente. Pero hay un detalle: si la cadena no corresponde a ningún valor del enum, obtendrá una ArgumentException. Y eso significa que el programa fallará.
Cuándo Enum.Parse es una mala elección
- No controla los datos de entrada (entrada de usuario)
- La cadena puede ser null o vacía
- Desea evitar excepciones
Para estos casos, se creó Enum.TryParse.
Enfoque seguro: Enum.TryParse — sin excepciones
Enum.TryParse en C# es su salvavidas. No lanza una excepción, sino que devuelve un bool: true si la conversión es exitosa y false en caso contrario.
string input = "Moderator";if (Enum.TryParse(input, ignoreCase: true, out UserRole result)){ Console.WriteLine($"Rol: {result}");}else{ Console.WriteLine("No se pudo reconocer el rol");}Tenga en cuenta: TryParse es un método genérico, por lo que no es necesario convertir el resultado. El parámetro ignoreCase funciona igual que en Parse. Este método es ideal para el análisis seguro de enum en C#.
Pero hay una trampa: TryParse considera exitoso el análisis de cadenas numéricas. La cadena "42" se convertirá en un valor de enum con el equivalente numérico 42, incluso si ese valor no existe. Para evitar esto, agregue