C#: Añandiendo descripciones a un Enum
Este código muy simple y nos permite añadir descripciones a nuestros Enum:
using System;
using System.Reflection;
namespace Enum
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(EnumDes.Descripcion<Navegadores>(Navegadores.Firefox));
Console.WriteLine(EnumDes.Nombre<Navegadores>("Mozilla Firefox"));
Navegadores valor = (Navegadores)EnumDes.Valor<Navegadores>("Mozilla Firefox");
if (valor == Navegadores.Firefox)
{
Console.WriteLine("Es Firefox... :)");
}
}
}
public enum Navegadores
{
[EnumDes("Mozilla Firefox")]
Firefox,
[EnumDes("Opera Browser")]
Opera
}
// Esta clase se crea como Atributo para insentar descripciones en cualquier enum
public class EnumDes : Attribute
{
private string _descripcion;
// Constructor
public EnumDes(string descripcion)
{
_descripcion = descripcion;
}
// Este método recupera la descripción del enum utilizando Reflection.
public static string Descripcion<T>(T _enum)
{
FieldInfo info = typeof(T).GetField(_enum.ToString(), BindingFlags.Public |
BindingFlags.Static);
foreach (object obj in info.GetCustomAttributes(false))
{
if (obj.GetType() == typeof(EnumDes))
{
return obj.ToString();
}
}
return "No se encontró la descripción";
}
public static FieldInfo Buscar<T>(string descripcion)
{
FieldInfo[] infos = typeof(T).GetFields(BindingFlags.Public |
BindingFlags.Static);
foreach (FieldInfo item in infos)
{
foreach (object attribute in item.GetCustomAttributes(false))
{
if (attribute.ToString() == descripcion)
{
return item;
}
}
}
return null;
}
public static string Nombre<T>(string descripcion)
{
FieldInfo info = Buscar<T>(descripcion);
return (info == null ? "No se encontró el valor" : info.Name);
}
public static object Valor<T>(string descripcion)
{
FieldInfo info = Buscar<T>(descripcion);
return (info == null ? null : info.GetValue(typeof(T)));
}
/* Se sobrescribe el método ToString() para retornar la descripción
* ingresada a través de su constructor.
*/
public override string ToString()
{
return _descripcion;
}
}
}
Categorías:C#, Enum, Programación, Reflection
Hola
tu código me hasifdo muy útil, solo me queda una duda
Se puede lograr el proceso inverso??? O sea a partir de la descripción obtener el valor.
saludos
Hola Michel,
Se puede obtener el valor a partir de la descripción y ya esta actualizado el código para realizar esta tarea.
Saludos.