2010-08-31 15 views
10

Por lo tanto, actualmente tiene una enumeración utilizada en el estado de una aplicación. Sin embargo, algo se siente cuando se usa contra la interfaz de usuario. Para muchas conversiones entre enteros y cadenas al llenar desplegables. Podría usar un método de extensión o el convertidor de tipo y continuar usando la enumeración, que será útil si una enumeración tiene varias palabras.Qué usar además de enum para C#

Pensé en preguntar acerca de llenar un posible agujero antes de cavarlo en profundidad.

Gracias.

+1

Tuve una pregunta similar, no relacionada con algunas buenas respuestas: http://stackoverflow.com/questions/1970594/enums-or-tables –

+0

¿Es correcto asumir que la interfaz de usuario que está utilizando es con wpf? –

+0

¿Se opone a simplemente escribir una clase estática que podría hacer lo mismo para que pueda evitar los problemas del boxeo? – joshlrogers

Respuesta

5

Si está trabajando con una variable que tiene un número finito y conocido de estados posibles, entonces una enumeración es de hecho la construcción correcta para su uso. Hay muchas maneras posibles de hacer el trabajo con la UI más conveniente, y ha citado dos excelentes, que son convertidores de tipo y métodos de extensión.

14

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:

  1. Decoramos los valores de enumeración con [Descripción ()] atributos que contienen el "nombre descriptivo" de cada constante enum.
  2. 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).
  3. 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; 
+0

Todas muy buenas sugerencias. Cada vez que configuro un nuevo proyecto, mi método Parse siempre se incluye :) –

+0

¡Yikes! Belleza :-) ¿Podría pedir su extensión GetDescription? Con el mismo propósito, escribí una clase de diccionario especial con nombres de enumeraciones, pero su enfoque parece más limpio. – greenoldman

+0

Al codificar el nombre visible para el usuario en el código, se compromete a reconstruir y redistribuir toda la aplicación, si el cliente decide que quiere ver el "Artículo 1" en lugar del "Artículo uno". También está impidiendo que el sistema se localice mediante el uso de archivos de recursos/ensambles satelitales. – mikemanne

0

una enumeración como constructo es definitivamente la elección correcta. Si por alguna razón no quieres usar el familiar sistema incorporado, puedes hacer que seas más propio de un bir más funcional.aquí está la idea básica:

class Country { 
    private static Country US; 
    private static Country JP 

    static Country() { //initialize static variables } 
    private Country(string name) { //initialize variables of Country instance } 

    } 

Hay un patrón de diseño para esto, pero olvidé el nombre.

+0

Recuerdo haberlo hecho en algún momento, pero ¿es realmente preferible a una enumeración o hay una gran diferencia? La enumeración me da un valor entero para que corresponda con las ID de mi base de datos, lo que significa una conversión menos. Off para hacer un poco de investigación, gracias. – Aur

Cuestiones relacionadas