Mi equipo tuvo este problema en nuestro proyecto reciente. Hemos mantenido las enumeraciones, porque son los que hay que utilizar para obtener una lista finita de valores constantes conocidos, pero lo hicimos un par de cosas para que sean más amistoso con el desarrollador:
- Decoramos los valores de enumeración con [Descripción ()] atributos que contienen el "nombre descriptivo" de cada constante enum.
- Creamos un método de extensión GetDescription() que examinaría reflexivamente el atributo Descripción de la constante enum y devolvería el nombre descriptivo. Si no tiene uno, el método intenta insertar espacios en el ToString() del nombre de la constante enum. Como las constantes de enum CamelCased eran un requisito de estilo impuesto por ReSharper, esto funcionó para aproximadamente el 90% de nuestras constantes, y los atributos de Descripción manejaron el resto (principalmente acrónimos en mayúscula en el nombre).
- Creamos un método de extensión genérico ParseEnum() para cadenas que básicamente envuelve Enum.Parse() (que es oogly; requiere especificar el tipo Enum en el método y luego convertirlo en él). Creo que puede ser lo suficientemente inteligente como para intentar buscar primero los atributos de la descripción, o bien simplemente usamos la representación ToString() aún legible como el valor de los datos del elemento desplegable.
Por lo tanto, dada la siguiente:
public enum MyItems
{
[Description("Item One")]
ItemOne,
[Description("Item Two")]
ItemTwo,
[Description("Item Three")]
ItemThree
}
que podría llenar un DropDownList con opciones fáciles de usar en dos líneas:
foreach(MyValues value in Enum.GetValues<MyValues>())
myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString())
... y entonces podríamos analizar la selección volver atrás con un código muy legible:
var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>()
EDITAR: me han pedido el método GetDescription(). Soy un poco dudoso acerca de compartir todo, pero aquí está el algoritmo básico para obtener un atributo Descripción que decora una constante enum. Analizar un nombre CamelCased es bastante sencillo. RegEx se divide en letras mayúsculas, y nuestra implementación es un poco ingenua de todos modos. Este fragmento requiere System.ComponentModel.DescriptionAttribute (que es también el decorador para las constantes de enumeración), y enumType es el "este" parámetro del método de extensión, de tipo Enum:
var attr = enumType.GetType().GetField(enumType.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute)attr[0]).Description;
Tuve una pregunta similar, no relacionada con algunas buenas respuestas: http://stackoverflow.com/questions/1970594/enums-or-tables –
¿Es correcto asumir que la interfaz de usuario que está utilizando es con wpf? –
¿Se opone a simplemente escribir una clase estática que podría hacer lo mismo para que pueda evitar los problemas del boxeo? – joshlrogers