Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=2dd2b514-82c4-41bf-86d0-d5d7bc117fa8

TRUCO: Cómo obtener los nombres de una enumeración

obtener_nombre_enumerador

En muchos programas se suelen dar a los usuarios una serie de opciones para que escoja. Por ejemplo un tipo de búsqueda a realizar, un rango de posibles valores para parametrizar algún comportamiento, etc...

Lo más habitual es que estas opciones se "mapeen" después a elementos de una enumeración en el código de la capa de negocio. De esta forma si definimos una similar a esta:

  public enum EstadoCivil
{
  Casado,
  Soltero,
  Divorciado,
  Viudo,
  Religioso,
}

lo más común será que en la interfaz de usuario exista un modo de seleccionar algún valor equivalente, por ejemplo a través de una lista desplegable o un conjunto de botones de radio.

Es bastante habitual generar los elementos de la interfaz manualmente, añadiendo opciones a una lista Web o Windows, por ejemplo, con código similar a este:

lista.Items.Add(new ListItem("Casado", "0");
lista.Items.Add(new ListItem("Soltero", "1");
etc...

Sin embargo, sería muy útil poder añadir automáticamente los valores de una enumeración cualquiera sin preocuparse por saber cuántas son o cuál es su nombre. Gracias al poder de la reflexión en .NET esto es algo muy sencillo de conseguir.

Por ejemplo, la siguiente función toma como argumentos una referencia a un control de lista cualquiera de .NET (ListBox, CheckBoxList, DropDownList, etc...) y un valor enumerado cualquiera y rellena el control con tantas opciones como tenga disponibles dicha enumeración:

private void Enlaza(ListControl lst, Enum e)
{
string[] valores = Enum.GetNames(e.GetType());
foreach (string valor in valores)
  lst.Items.Add(valor);
}

Toda la clave está en el método GetNames del tipo Enum, que devuelve una matriz con los nombres de cada elemento de la enumeración indicada. Así, para rellenar una lista sólo hay que escribir, por ejemplo:

Enlaza(miListBox, EstadoCivil.Casado);

o sea, se le pasa una referencia al control de lista y un miembro cualquiera de la enumeración.

Fácil ¿verdad?

La anterior función es muy sencilla pero puede dar algunos problemas. Por ejemplo, si al definir la enumeración se han declarado algunos miembros con valores específicos y diferentes a los valores por defecto, entonces el orden en la lista no coincidirá con el valor de cada miembro (0, 1, 2...). Se puede arreglar, pero complica algo la función. El código definitivo es el siguiente:

private void Enlaza(ListControl lst, Enum e)
{
   Type tipo = Enum.GetUnderlyingType(e.GetType());
   string[] nombres = Enum.GetNames(e.GetType());
   Array valores = Enum.GetValues(e.GetType());
   for(int i=0; i<nombres.Length;i++)
     lst.Items.Add(new ListItem(nombres[i], Convert.ChangeType(valores.GetValue(i), tipo).ToString() ) );
}

Con esto ya queda totalmente definido. Se convierte cada uno de los valores a su tipo subyacente (para obtener su valor numérico, no su nombre) y luego se convierte en una cadena para añadirlo al ListItem. Lo bueno de este código es que, aunque un poco más complicado permite trabajar de forma genérica con cualquier enumeración, sin importar su tipo o la cantidad de elementos que tenga.

Se puede retocar la función para que, si se desea, se añada opcionalmente un elemento extra al principio o al final para permitir que el usuario escoja otra opción (por ejemplo, "Otro", "Ninguno", "[Cualquiera]"... dependiendo del contexto).

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Trucos

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.