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:
- Nous décoraient les valeurs enum avec [Description ()] attributs contenant le "nom convivial" de chaque constante enum.
- 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).
- 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;
Avait une question similaire, sans rapport avec quelques bonnes réponses: http://stackoverflow.com/questions/1970594/enums-or-tables –
est-il correct de supposer que l'interface utilisateur que vous utilisez est avec wpf? –
Ê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