Mon énumération comprend les valeurs suivantes:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Je veux cependant pouvoir afficher ces valeurs de manière conviviale.
Je n'ai pas besoin de pouvoir à nouveau passer de la chaîne à la valeur.
Réponses:
J'utilise l'
Description
attribut de l'espace de noms System.ComponentModel. Décorez simplement l'énumération:Utilisez ensuite ce code pour le récupérer:
la source
ArgumentException
, alors il n'y a aucune raison pour que la méthode soit complètement générique.Je le fais avec des méthodes d'extension:
la source
default
implémentation de cas de revenirme.ToString()
et de fournir uniquement des instructions de casse de commutateur pour les valeurs d'énumération que vous souhaitez remplacer. Dans votre exemple, je comprends qu'ils sont tous différents, mais dans les cas d'utilisation réels, je soupçonne que la plupart des valeurs d'énumération d'un seul mot suffiront et vous ne fournirez que des remplacements pour les valeurs d'énumération de plusieurs mots.Peut-être que je manque quelque chose, mais quel est le problème avec Enum.GetName?
edit: pour des chaînes conviviales, vous devez passer par un .resource pour effectuer l'internationalisation / localisation, et il serait sans doute préférable d'utiliser une clé fixe basée sur la clé enum qu'un attribut décorateur sur le même.
la source
J'ai créé une méthode d'extension inverse pour reconvertir la description en une valeur énumérée:
la source
La solution la plus simple ici consiste à utiliser une méthode d'extension personnalisée (dans .NET 3.5 au moins - vous pouvez simplement la convertir en une méthode d'assistance statique pour les versions de framework antérieures).
Je suppose ici que vous souhaitez renvoyer autre chose que le nom réel de la valeur d'énumération (que vous pouvez obtenir en appelant simplement ToString).
la source
Cet autre poste est Java. Vous ne pouvez pas mettre de méthodes dans Enums en C #.
faites juste quelque chose comme ça:
Si vous souhaitez utiliser différentes valeurs d'affichage pour vos valeurs d'énumération, vous pouvez utiliser Attributs et Réflexion.
la source
Le moyen le plus simple consiste simplement à inclure cette classe d'extension dans votre projet, elle fonctionnera avec n'importe quelle énumération du projet:
Usage:
...
la source
string result = "Result: " + ee;
Quelques autres options plus primitives qui évitent les classes / types de référence:
Méthode de tableau
Usage
Méthode de structure imbriquée
Usage
Mise à jour (03/09/2018)
Un hybride de méthodes d'extension et la première technique ci-dessus.
Je préfère que les énumérations soient définies là où elles "appartiennent" (les plus proches de leur source d'origine et non dans un espace de noms global commun).
La méthode d'extension semble adaptée à un espace commun, et la définition "localisée" de l'énumération rend maintenant la méthode d'extension plus verbeuse.
Un exemple d'utilisation de l'énumération et de sa méthode d'extension.
Remarque: J'ai en fait décidé d'éliminer le
Enum
wrapper (et leName
tableau), car il est préférable que les chaînes de noms proviennent d'une ressource (c'est-à-dire un fichier de configuration ou une base de données) au lieu d'être codées en dur, et parce que j'ai fini par mettre la méthode d'extension dans leViewModels
espace de noms (juste dans un autre fichier "CommonVM.cs"). De plus, le tout.Id
devient distrayant et encombrant.CommonVM.cs
Un exemple d'utilisation de l'énumération et de sa méthode d'extension.
la source
Vous pouvez utiliser Humanizer package avec Humanize énumérations possiblity. Un exemple:
alors vous pouvez utiliser
Humanize
directement la méthode d'extension sur enum:la source
En ce qui concerne Ray Booysen, il y a un bogue dans le code: Enum ToString avec des chaînes conviviales
Vous devez tenir compte de plusieurs attributs sur les valeurs d'énumération.
la source
la source
this
paramètre dans les méthodes d'extension, que vous pouvez voir appeléThis
dans de nombreux exemples sur le Web. L'appeler comme son type comme vous l'avez fait (Enum Enum
) rend le code moins lisible.Au lieu d'utiliser une énumération, utilisez une classe statique.
remplacer
avec
il sera utilisé comme ça
Problème en utilisant les meilleures solutions de "méthode d'extension":
Une énumération privée est souvent utilisée dans une autre classe. La solution de méthode d'extension n'est pas valide car elle doit être dans sa propre classe. Cette solution peut être privée et intégrée dans une autre classe.
la source
Il se trouve que je suis un fan de VB.NET, alors voici ma version, combinant la méthode DescriptionAttribute avec une méthode d'extension. Premièrement, les résultats:
Trucs de base: une énumération appelée EnumType avec trois valeurs V1, V2 et V3. La "magie" se produit dans l'appel Console.WriteLine dans Sub Main (), où le dernier argument est simplement
v.Description
. Cela renvoie "Un" pour V1, "V2" pour V2 et "Trois" pour V3. Cette description-méthode est en fait une méthode d'extension, définie dans un autre module appelé EnumExtensions:Parce que la recherche d'attributs de description à l'aide
Reflection
est lente, les recherches sont également mises en cache dans un environnement privé.Dictionary
, qui est rempli à la demande.(Désolé pour la solution VB.NET - il devrait être relativement simple de la traduire en C #, et mon C # est rouillé sur de nouveaux sujets comme les extensions)
la source
Résumé clair des suggestions ci-dessus avec un échantillon:
USAGE:
la source
Utilisez Enum.GetName
À partir du lien ci-dessus ...
la source
Selon cette documentation: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Il est possible de convertir simplement un énumérateur en chaîne en utilisant un format comme celui-ci:
Vous pouvez voir tous les formats possibles dans ce lien: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
la source
Il s'agit d'une mise à jour du code de Ray Booysen qui utilise la méthode générique GetCustomAttributes et LINQ pour rendre les choses un peu plus ordonnées.
la source
Résumé encore plus net:
Même utilisation que le trait de soulignement décrit.
la source
Pour les drapeaux enum y compris.
la source
Dans le cas où vous souhaitez simplement ajouter un espace entre les mots, c'est aussi simple que
la source
J'utilise une classe générique pour stocker les paires énum / description et une classe d'aide imbriquée pour obtenir la description.
L' énumération :
La classe générique:
Remarque: Puisqu'une classe générique ne peut pas être contrainte par une énumération, je contrains par struct à la place et vérifie l' énumération dans le constructeur.
Usage:
la source
Je pense que la meilleure façon (et la plus simple) de résoudre votre problème est d'écrire une méthode d'extension pour votre énumération:
la source
Si vous voulez quelque chose de complètement personnalisable, essayez ma solution ici:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Fondamentalement, la publication explique comment attacher des attributs de description à chacune de vos énumérations et fournit un moyen générique de mapper de l'énumération à la description.
la source