2010-08-31 7 views
10

Donc, actuellement, une énumération est utilisée sur l'état d'une application. Cependant, quelque chose se sent en l'utilisant contre l'interface utilisateur. Pour de nombreuses conversions entre entier et chaîne lors du remplissage des listes déroulantes. Je pourrais utiliser une méthode d'extension ou le convertisseur de type et continuer à utiliser l'énumération qui sera utile si une énumération contient plusieurs mots.Ce qu'il faut utiliser en plus de enum pour C#

Je pensais que je demanderais à voir à propos du remplissage d'un trou possible avant de le creuser en profondeur.

Merci.

+1

Avait une question similaire, sans rapport avec quelques bonnes réponses: http://stackoverflow.com/questions/1970594/enums-or-tables –

+0

est-il correct de supposer que l'interface utilisateur que vous utilisez est avec wpf? –

+0

Êtes-vous opposé à l'écriture d'une classe statique qui pourrait faire la même chose afin que vous puissiez éviter les problèmes de boxe? – joshlrogers

Répondre

5

Si vous travaillez avec une variable qui a un nombre fini et connu d'états possibles, alors une énumération est en effet la construction correcte à utiliser. Il existe de nombreuses façons de rendre le travail avec l'interface utilisateur plus pratique, et vous en avez cité deux excellentes, à savoir les convertisseurs de type et les méthodes d'extension.

14

Mon équipe a eu ce problème dans notre récent projet. Nous avons gardé les énumérations, parce qu'ils sont la chose à utiliser pour une liste finie de valeurs constantes connues, mais nous avons fait quelques petites choses pour les rendre plus développeur convivial:

  1. Nous décoraient les valeurs enum avec [Description ()] attributs contenant le "nom convivial" de chaque constante enum.
  2. Nous avons créé une méthode d'extension GetDescription() qui examinerait de manière réfléchie l'attribut Description de la constante enum et renverrait le nom convivial. S'il n'en a pas, la méthode tente d'insérer des espaces dans le ToString() du nom de la constante enum. Comme les constantes d'énumération CamelCased étaient une exigence de style appliquée par ReSharper, cela fonctionnait pour environ 90% de nos constantes, et les attributs de description géraient le reste (principalement des acronymes en majuscules dans le nom).
  3. Nous avons créé une méthode d'extension générique ParseEnum() pour les chaînes qui enveloppe fondamentalement Enum.Parse() (qui est oogly, nécessite de spécifier le type Enum dans la méthode, puis de l'utiliser). Je pense qu'il est peut-être assez intelligent d'essayer d'abord de rechercher les attributs de description, sinon nous utilisons simplement la représentation ToString() encore lisible comme valeur de données de l'élément déroulant.

Ainsi, étant donné les éléments suivants:

public enum MyItems 
{ 
    [Description("Item One")] 
    ItemOne, 
    [Description("Item Two")] 
    ItemTwo, 
    [Description("Item Three")] 
    ItemThree 
} 

nous pourrions remplir un DropDownList avec des choix conviviaux en deux lignes:

foreach(MyValues value in Enum.GetValues<MyValues>()) 
    myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString()) 

... et nous pourrions analyser la sélection revenir en arrière avec le code très lisible:

var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>() 

EDIT: La méthode GetDescription() m'a été demandée. Je suis un peu incertain sur le partage de l'ensemble, mais voici l'algorithme de base pour obtenir un attribut Description qui décore une constante enum. L'analyse d'un nom CamelCased est assez simple, RegEx se scinde en majuscules, et notre implémentation est un peu naïve quand même. Cet extrait nécessite System.ComponentModel.DescriptionAttribute (qui est aussi le décorateur pour les constantes de ENUM) et EnumType est le paramètre « this » de la méthode d'extension, de type Enum:

var attr = enumType.GetType().GetField(enumType.ToString()) 
       .GetCustomAttributes(typeof(DescriptionAttribute), false); 
    if (attr.Length > 0) 
     return ((DescriptionAttribute)attr[0]).Description; 
+0

Toutes très bonnes suggestions. Chaque fois que je mets en place un nouveau projet, ma méthode Parse est toujours lancée :) :) –

+0

Yikes! Beauté :-) Puis-je demander votre extension GetDescription. Dans le même but, j'ai écrit une classe spéciale de dictionnaire avec des noms d'énumérations, mais votre approche semble plus propre. – greenoldman

+0

par coder en dur le nom visible par l'utilisateur dans le code, vous vous engagez à nouveau bâtiment et redistribuant l'application entière, si le client décide qu'ils veulent voir « Point 1 » au lieu de « Point One ». Vous empêchez également la localisation du système à l'aide de fichiers de ressources/assemblages de satellites. – mikemanne

0

Un Enum comme construction est certainement le bon choix. Si, pour une raison ou une autre, vous ne voulez pas utiliser le mode familier, vous pouvez vous en approprier plus.voici l'idée de base:

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

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

    } 

Il ya un motif de conception pour cela, mais j'ai oublié le nom.

+0

Je me souviens de l'avoir fait quelque part, mais est-ce vraiment préférable à une énumération ou y a-t-il une grande différence? L'énumération me donne une valeur entière pour correspondre aux ID de ma base de données, ce qui signifie une conversion de moins. En route pour faire des recherches, merci. – Aur