10
votes

Que utiliser à part enum pour C #

a donc actuellement une énumération utilisée sur l'état d'une application. Cependant, quelque chose se sent lorsque vous l'utilisez contre l'interface utilisateur. À de nombreuses conversions entre entier et la chaîne lors de la collecte de dépose. Je pourrais utiliser une méthode d'extension ou le convertisseur de type et continuer à utiliser l'énum qui sera utile si un énumé a plusieurs mots dedans.

pensais que je demanderais à voir de remplir un trou possible avant de le creuser.

merci.


7 commentaires

Eu une question similaire et non liée avec de bonnes réponses: Stackoverflow.com/Questtions/1970594/Enums-or-tables


Est-il correct d'assumer l'interface utilisateur que vous utilisez est avec WPF?


Êtes-vous opposé à simplement écrire une classe statique qui pourrait faire la même chose afin que vous puissiez éviter les problèmes de boxe?


MSMVPS.com/ Blogs / Deborahk / Archive / 2009/07 / 10 / ...


Je suis d'accord avec Kieths, en supposant que son scénario reflète le vôtre. Le problème n'est pas la structure Enum, c'est que vous reproduisez les efforts pour représenter la valeur en tant que texte sympathique. Faites-le une fois dans une méthode, puis appelez cette méthode lorsque vous en avez besoin.


Essayer de revenir à l'utilisation du WPF. Pas opposé à une classe statique, vous souvenez-vous du modèle de conception par hasard? Je veux piquer au positif et aux négatifs avant de changer comme ça. Je crois que je reçois le sentiment que l'utilisation de la méthode d'extension et du convertisseur de type est la voie à suivre comme indiqué et expliquée ci-dessous. Cependant, la classe statique est intéressante.


"Écrire simplement" une classe statique signifie que vous devez écrire tout le temps, donc ce n'est pas "juste". Si quelque chose est préférable d'écrire une classe non statique (pour tous les énumérations), puis créez une instance statique de celle-ci.


3 Réponses :


5
votes

Si vous travaillez avec une variable comportant un nombre fini et bien connu d'états possibles, alors un énumé est en effet la construction correcte à utiliser. Il existe de nombreuses façons possibles de faire fonctionner avec l'interface utilisateur plus pratique et vous avez cité deux excellentes convertisseurs de type et des méthodes d'extension.


0 commentaires

14
votes

Mon équipe a eu cette question dans notre projet récent. Nous avons gardé les énumes, car ils sont la chose à utiliser pour une liste finie de valeurs constantes connues, mais nous avons fait quelques choses pour les rendre plus développeurs:

  1. Nous avons décoré les valeurs ENUM avec les attributs [Description ()] contenant le "nom sympathique" de chaque constante d'énum. li>
  2. Nous avons créé une méthode d'extension getDescription () qui réfléchirait à l'attribut de description de l'ENum Constant et renvoie le nom sympathique. S'il n'en possède pas un, la méthode tente d'insérer des espaces dans la touche Tostring () du nom de constante Enum. En tant que Constantes de Camelcast Enum, les constantes de style sont appliquées par Resharper, cela a fonctionné pendant environ 90% de nos constantes, et des attributs de description gèrent le reste (principalement des acronymes majuscules dans le nom). LI>
  3. Nous avons créé une méthode d'extension générique de parseenum () pour les chaînes qui enroule essentiellement ENUM.PARSE () (qui est anticly; nécessite de spécifier le type ENum dans la méthode, puis de la jeter). Je pense que cela peut être suffisamment intelligent d'essayer d'abord de rechercher des attributs de description, sinon nous utilisons simplement la représentation de tostring toujours lisible () comme valeur de données de l'élément déroulant. LI> ol>

    Donc, étant donné les éléments suivants: P>

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


4 commentaires

Toutes les très bonnes suggestions. Chaque fois que j'ai mis en place un nouveau projet ma méthode d'analyse est toujours poussé dans :)


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


En codant durement le nom de l'utilisateur visible dans le code, vous vous engagez à repousser et à ré-distribuer sur l'ensemble de l'application, si le client décide qu'ils veulent voir «l'élément 1» au lieu de «l'élément». Vous empêchez également le système d'être localisé grâce à l'utilisation d'ensembles de fichiers de ressources / satellites.


@mikemanne - Tout ce que vous avez dit est vrai. Dans notre cas, ce n'étaient pas des préoccupations majeures; Le changement est trivial pour faire et inclure dans un calendrier de libération, ce qui était une application intranet, uniquement en anglais. Cependant, ces préoccupations sont importantes pour que quelqu'un développe une application multilingue, et je ne recommanderais pas cette solution exacte alors. La description pourrait être donnée une couche d'abstraction à une valeur dans des tables d'étiquettes multilingues dans la DB, ou à un fichier de configuration, et getDescription étendue à la recherche d'une langue. Tous ces éléments vont ajouter de la complexité et peuvent rendre les autres changements plus difficiles.



0
votes

Un énumé comme construction est définitivement le bon choix. Si, pour une raison quelconque, vous ne voulez pas utiliser de manière familière intégrée, vous pouvez faire que vous êtes propre avec un BIR plus fonctionnel. Voici l'idée de base: xxx

Il y a un modèle de conception pour cela, mais j'oublie le nom.


1 commentaires

Je me souviens de faire cela à un moment donné quelque part, cependant cela est vraiment préférable à une énumération ou y a-t-il une grande différence? L'ENUM me donne une valeur entière pour correspondre à IDS Iny ma base de données, ce qui signifie une conversion de moins. Off Pour faire des recherches, merci.