¿Por qué la pregunta "How can I enumerate an enum?" es tan popular?
\n\nSi alguna vez has programado en C# y te has encontrado con enumeraciones (enum), seguramente te habrás preguntado: «¿Cómo obtengo todos los valores de este enum?». Esta pregunta es todo un éxito en Stack Overflow, con miles de visitas. Y no es de extrañar: enumerar un enum es una de esas tareas que parecen sencillas, pero sin conocer la sintaxis correcta puede dejar perplejo incluso a un desarrollador experimentado.
En este artículo, analizaremos cómo enumerar correctamente todos los valores de un enum en C#, mostraremos ejemplos de código funcionales que puedes copiar directamente en tu proyecto y hablaremos de los posibles obstáculos. ¡Allá vamos!
\n\n¿Qué es un enum en C#? Un breve recordatorio
\n\nEnum (enumeración) es un tipo de dato que permite definir un conjunto de constantes con nombre. Por ejemplo, los días de la semana, estados de un pedido o tipos de error. En C#, un enum se declara así:
\n\npublic enum DayOfWeek\n{\n Monday,\n Tuesday,\n Wednesday,\n Thursday,\n Friday,\n Saturday,\n Sunday\n}\n\nA cada elemento se le asigna por defecto un valor entero (comenzando desde 0). Pero a menudo surge la necesidad de recorrer todos los elementos de un enum — por ejemplo, para mostrarlos en una lista desplegable, crear un array o verificar si existe un valor.
\n\nCómo enumerar todos los valores de un enum: método básico
\n\nLa forma más popular y sencilla es usar el método estático Enum.GetValues(). Devuelve un array de todos los valores de la enumeración especificada. Así 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 // Obtenemos todos los valores del enum\n Status[] allStatuses = (Status[])Enum.GetValues(typeof(Status));\n\n // Los recorremos con foreach\n foreach (Status status in allStatuses)\n {\n Console.WriteLine(status);\n }\n }\n}\n\nResultado de la ejecución:
\nNew\nInProgress\nCompleted\nCancelled\n\nObserva: convertimos explícitamente el resultado a un array Status[], porque Enum.GetValues() devuelve un Array (sin tipo específico).
Alternativa: Enum.GetNames()
\n\nSi necesitas no los valores en sí, sino solo sus nombres como cadenas, usa Enum.GetNames():
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n Console.WriteLine(name);\n}\n\nEl resultado será el mismo, pero el tipo del elemento es string, no Status. Esto es útil cuando trabajas con interfaces de usuario o serialización.
Enfoque moderno: versión genérica (C# 7.3+)
\n\nA partir de C# 7.3, tenemos una forma más elegante: Enum.GetValues<T>(). Devuelve un array del tipo específico y no requiere conversión:
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 es más corto y más seguro en cuanto a tipos. Si usas una versión moderna de C# (¡y deberías!), te recomiendo este.
\n\nEjemplo de la vida real: llenar una lista desplegable
\n\nImagina que estás escribiendo una aplicación para gestionar tareas. Necesitas mostrar al usuario una lista de estados posibles en un menú desplegable. Así se hace con enumeración 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