Comment attribuer des valeurs de chaîne pour les énumérations et utiliser cette valeur dans un switch
Essentiellement à une série de titres sera passé dans l'instruction switch et j'ai besoin de les comparer à l'encontre de la chaîne de valeurs de l'enum. Mais j'ai peu ou aucune idée de comment faire cela correctement.
Aussi, je ne sais pas si c'est encore la meilleure approche donc si quelqu'un a des idées?
Par exemple:
enum
{
doctor = "doctor",
mr = "mr",
mrs = "mrs"
}
et puis de passer à travers la chaîne de valeurs j'ai assigné.
OriginalL'auteur ediblecode | 2011-11-01
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir un
enum
avec un type sous-jacent destring
. Le type sous-jacent peut être n'importe quel type intégral à l'exception dechar
.Si vous voulez traduire une
string
à votreenum
alors vous aurez probablement besoin d'utiliser leParse
ouTryParse
méthodes.OriginalL'auteur LukeH
J'ai trouvé que la meilleure façon pour moi de faire cela est d'utiliser le Système.ComponentModel.Description de l'attribut sur les valeurs enum.
Voici un exemple:
Ensuite, pour l'utiliser, créez une méthode d'extension sur une classe statique comme suit:
Edit: j'ai réécrit le code d'origine en tant que générique de la méthode d'extension sur une classe qui implémente
IConvertible
(Enum
implémente cette interface, de sorte qu'il fonctionne de la manière que nous en avons besoin pour). Voici une méthode générique qui fonctionne sur tous les énumérations:Donc, pour obtenir la chaîne de caractères associée à notre enum ci-dessus, on peut utiliser le code suivant:
Voici un autre exemple de Enum:
Voici le code pour voir la description:
Résultats seront:
Je voulais aller de l'avant et l'après de la méthode générique car il est beaucoup plus utile. Il vous évite d'avoir à écrire une extension personnalisée pour tous vos énumérations.
Fonctionne, mais est incroyablement lent
D'accord, mais le coût peut être vaut la peine. Il est dans notre cas, à très peu d'endroits que nous utiliser cette fonctionnalité. C'est particulièrement lent si le magasin de sauvegarde de la base de données. Mais les avantages et les cas d'utilisation existent.
Merci, cela a été utile. J'ai mis à jour, il renvoie le nom de l'enum si il n'y a pas de Description, de retour de type.GetEnumName(val) si descriptionAttribute est null.
Dickinson - C'est une excellente idée. Merci pour le partage.
OriginalL'auteur Michael Earls
Ce n'est pas le genre de chose qui doit être codée en dur. Il devrait être guidé par les données, éventuellement lire à partir d'un fichier externe ou de la base de données. Vous pouvez stocker dans un
Dictionary
et utilisez les touches du clavier pour conduire votre logique.Le codage en dur enum descriptions, c'est pas plus mauvaise que de noms des classes après le monde réel des objets du domaine. Parfois un Poisson.BabelFish sera toujours un "poisson de Babel". Un cas pourrait être fait pour obtenir les valeurs à partir d'une ressource localisée (la mondialisation), mais vous n'avez pas à obtenir tout élément d'information à partir d'une base de données ou un fichier externe.
Comtes - Applications d'aller et venir, mais les données des vies pour toujours. Si vous le mettez dans la base de données, il peut être utilisé à partir de n'importe quel nombre d'applications. asktom.oracle.com/pls/asktom/...
Bon point. Merci pour le lien. C'était très instructif.
OriginalL'auteur Joe
Énumérations ne peut pas être de type string.
Les types approuvés pour un enum sont des octets, sbyte, short, ushort, int, uint, long, ou ulong.
http://msdn.microsoft.com/en-us/library/sbbt4032.aspx
Mes excuses alors, j'ai lu la même chose puisque les valeurs sous-jacentes sont le type de l'enum.
OriginalL'auteur Jay
Enum ne peut avoir intégrale sous-jacent types (sauf char). Par conséquent, vous ne pouvez pas faire ce que vous voulez, au moins directement.
Cependant, vous pouvez traduire la chaîne que vous avez pour le type enum:
OriginalL'auteur tafa
Je crois que le standard de la façon de le faire est d'utiliser une classe statique avec readonly les propriétés de la chaîne qui retournent la valeur que vous souhaitez.
OriginalL'auteur Bradley Uffner
Pourquoi ne pas utiliser simplement une pure enum et les interrupteurs?
Ensuite, vous pouvez utiliser, c'est comme
vous pouvez créer une carte
Dictionary<string, Prefix> map
, le remplir, puis donné une chaîne de "Caporal" de trouver une valeur d'enum (commePrefix p = map["Lance Corporal"];
) et de faire un switch sur le type enum.OriginalL'auteur Evgeniy Krechun
Je voulais ajouter une autre solution pour tous ceux qui à l'aide de C# 6 ou plus.
Si vous souhaitez seulement obtenir le nom de la valeur d'Enum, vous pouvez utiliser la nouvelle nameof() la méthode introduite en C# 6.
Même si cela peut sembler excessif au premier coup d'œil (pourquoi ne pas simplement définir la valeur de la chaîne "EnumVal1" pour commencer?), il vous donnera le temps de compilation en vérifiant que la valeur est valide. Donc, si jamais vous changez le nom de la valeur d'enum et oublier de dire à votre IDE pour rechercher et remplacer toutes les références, il ne compile pas jusqu'à ce que vous corriger.
OriginalL'auteur Michael Earls
Avoir une lecture de ce tutoriel de comprendre comment les énumérations de travail. Il y a des exemples de
switch
aussi des déclarations.OriginalL'auteur Sir Crispalot