martes, 15 de junio de 2010

Pseudo-enumeraciones con valores de cadena en C#

El lenguaje C# nos permite definir enumeraciones para dotar de un nombre significativo a una serie de valores numéricos. En ocasiones nos encontramos con que nos iría bien poder definir enumeraciones cuyos valores no sean numéricos (típicamente cadenas), y en ese caso podemos definir constantes, pero por desgracia las constantes se definen a nivel de clase y por tanto no son reutilizables.

La buena noticia es que podemos crear algo parecido a enumeraciones con tipos no numéricos sin más que definir una clase con campos estáticos de sólo lectura. Verbigracia:

Lo malo es que perdemos todas las capacidades de manipulación de claves y valores que nos ofrece la clase Enum, pero si realmente nos hace falta tal cosa, podemos montarnos a mano los métodos que necesitemos usando un poco de reflexión (ejemplo para .NET 3.5 o superior, que como soy muy vago uso LINQ):

Con unas modificaciones mínimas, esto sirve para enumeraciones de cualquier tipo, no sólo de cadenas. O también se podría modificar la clase StringEnum para que sea genérica, cosa que dejo como ejercicio para el (hipotético) lector.

0 puesyocreoques: