Ardalis.SmartEnum para C# (.NET): guía completa con ejemplos
1. ¿Qué es y por qué usarlo?
Ardalis.SmartEnum es una librería para C# (.NET) que resuelve uno de los problemas más comunes en el desarrollo: las limitaciones de los enumerados (enum) tradicionales. Los enumerados nativos de C# son, en esencia, un conjunto de constantes numéricas. No pueden contener lógica, campos adicionales (como descripciones, códigos de moneda o colores) ni métodos. Esto obliga a usar estructuras switch o if-else que violan los principios SOLID (especialmente el Principio Abierto/Cerrado) y hacen que el código sea más difícil de mantener.
SmartEnum ofrece una alternativa: los enumerados inteligentes (Smart Enums). Son clases que heredan de la clase base SmartEnum<TEnum, TValue>. Cada valor de este enumerado es un campo estático singleton. Gracias a esto, puedes agregar cualquier propiedad (Name y Value son obligatorias, además de las personalizadas), métodos e incluso implementar interfaces. Esto transforma un enumerado de un simple conjunto de números en un objeto completo con comportamiento.
¿Para qué sirve? Primero, para seguridad de tipos. No puedes asignar accidentalmente un valor que no esté definido en el enumerado (a diferencia de los enum tradicionales, donde puedes hacer (MiEnum)42). Segundo, para encapsular la lógica. En lugar de escribir métodos de extensión o clases auxiliares, colocas la lógica directamente dentro del enumerado. Tercero, para mejorar la legibilidad. El código se vuelve autodocumentado: cada valor del enumerado incluye no solo un nombre, sino también contexto.
2. Instalación
La librería se instala a través de NuGet. Ejecuta uno de los siguientes comandos en la consola del administrador de paquetes o en la terminal de .NET CLI:
# Con .NET CLI
dotnet add package Ardalis.SmartEnum
# Con Package Manager Console
Install-Package Ardalis.SmartEnum
Después de la instalación, agrega using Ardalis.SmartEnum; al inicio del archivo.
3. Inicio rápido — ejemplo mínimo funcional
Vamos a crear un enumerado simple para los días de la semana. Observa que heredamos de SmartEnum<TEnum, TValue>, donde TEnum es nuestra clase y TValue es el tipo del valor (normalmente int o string).
using Ardalis.SmartEnum;
public sealed class DiaSemana : SmartEnum<DiaSemana, int>
{
// Los campos estáticos son los valores del enumerado
public static readonly DiaSemana Lunes = new DiaSemana(nameof(Lunes), 1);
public static readonly DiaSemana Martes = new DiaSemana(nameof(Martes), 2);
public static readonly DiaSemana Miercoles = new DiaSemana(nameof(Miercoles), 3);
public static readonly DiaSemana Jueves = new DiaSemana(nameof(Jueves), 4);
public static readonly DiaSemana Viernes = new DiaSemana(nameof(Viernes), 5);
public static readonly DiaSemana Sabado = new DiaSemana(nameof(Sabado), 6);
public static readonly DiaSemana Domingo = new DiaSemana(nameof(Domingo), 7);
// El constructor privado es obligatorio
private DiaSemana(string name, int value) : base(name, value) { }
}
// Uso
public class Program
{
public static void Main()
{
var hoy = DiaSemana.Lunes;
Console.WriteLine(hoy.Name); // Lunes
Console.WriteLine(hoy.Value); // 1
// Búsqueda por valor
var diaDesdeValor = DiaSemana.FromValue(3);
Console.WriteLine(diaDesdeValor.Name); // Miercoles
// Búsqueda por nombre
var diaDesdeNombre = DiaSemana.FromName("Viernes");
Console.WriteLine(diaDesdeNombre.Value); // 5
}
}
4. Métodos/funciones/clases principales
Veamos las funcionalidades clave de