Hace unos meses atrás escribí un artículo inicial sobre Enumeraciones y algunos ejemplos básicos. Hoy pretendo continuar aquel post, y veremos los siguientes aspectos:
- Usar atributos en Enumeraciones.
- Método para recuperar el atributo de un determinado valor de la enumeración (GetDescripcion).
- Método para recuperar una lista de todos los elementos de la Enumeración (GetValoresDescripciones).
El objetivo de ambos métodos extensores es poder hacer lo siguiente:
string descripcion = TipoDocumento.Dni.GetDescripcion();
var lstEnumVals = typeof(TipoDocumento).GetValoresDescripciones();
Usar Enumeración con Attribute
[Descripcion("Número de Identificación de Extranjeros")]
NIE, // 1
Nota: El tipo predeterminado subyacente de las enumeraciones es el int y el primer enumerador tiene valor 0, incrementándose sucesivamente en 1 (A menos que definamos otra cosa).
La enumeración definida, está usando un atributo (Descripcion) que debemos definir en una clase (DescripcionAttribute) como veremos a continuación:
public class DescripcionAttribute : Attribute
{
public string Descripcion { get; set; }
public DescripcionAttribute(string descripcion)
{
Descripcion = descripcion;
}
}
Recuperar Attribute de un elemento Enum
public static string GetDescripcion(this Enum valor)
{
Type type = valor.GetType();
FieldInfo fieldInfo = type.GetField(valor.ToString());
var attribs = fieldInfo.GetCustomAttributes(
typeof(DescripcionAttribute), false) as DescripcionAttribute[];
return (attribs == null || attribs.Length == 0) ?
valor.ToString() : attribs[0].Descripcion;
}
Recuperar todos los elementos de una Enum
public static List<KeyValuePair<string, string>> GetValoresDescripciones(
this Type enumType)
{
var arrValores = Enum.GetValues(enumType);
var lstEnumDescripcion = new List<KeyValuePair<string, string>>();
foreach (var valor in arrValores)
{
FieldInfo fieldInfo = enumType.GetField(valor.ToString());
var attribs = fieldInfo.GetCustomAttributes(
typeof(DescripcionAttribute), false) as DescripcionAttribute[];
var descripcion = (attribs == null || attribs.Length == 0) ?
valor.ToString() : attribs[0].Descripcion;
lstEnumDescripcion.Add(
new KeyValuePair<string, string>(valor.GetHashCode().ToString(), descripcion));
}
return lstEnumDescripcion;
}
O si prefieres crear el mismo método, pero remplazando el foreach por expresiones LINQ entonces:
public static List<KeyValuePair<string, string>> GetValoresDescripciones(
this Type enumType)
{
var arrValores = Enum.GetValues(enumType);
return (from object valor in arrValores
let fieldInfo = enumType.GetField(valor.ToString())
let attribs = fieldInfo.GetCustomAttributes(typeof (DescripcionAttribute), false)
as DescripcionAttribute[]
let descripcion = (attribs == null || attribs.Length == 0) ?
valor.ToString() : attribs[0].Descripcion
select new KeyValuePair<string, string>(
valor.GetHashCode().ToString(), descripcion)).ToList();
}
Artículos Relacionados:
No hay comentarios:
Publicar un comentario