13 de junio de 2010

Enum, Attribute To List

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:

  1. Usar atributos en Enumeraciones.
  2. Método para recuperar el atributo de un determinado valor de la enumeración (GetDescripcion).
  3. 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();

Enum 2 List

Usar Enumeración con Attribute

enum TipoDocumento
{
    [Descripcion("Documento Nacional de Identidad")]
    DNI, // 0

   

    [Descripcion("Número de Identificación de Extranjeros")]

    NIE, // 1

   
    Pasaporte, // 2
   
    [Descripcion("Otros Documentos")]
    Otro = 99
};

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