C# fonction qui accepte un Enum élément et renvoie la valeur d'enum (pas d'index)
dire que j'ai les déclarations suivantes:
public enum Complexity { Low = 0, Normal = 1, Medium = 2, High = 3 }
public enum Priority { Normal = 1, Medium = 2, High = 3, Urgent = 4 }
et je veux le code pour que je puisse obtenir la valeur d'enum (pas sur l'index, comme je l'ai mentionné plus tôt):
//should store the value of the Complexity enum member Normal, which is 1
int complexityValueToStore = EnumHelper.GetEnumMemberValue(Complexity.Normal);
//should store the value 4
int priorityValueToStore = EnumHelper.GetEnumMemberValue(Priority.Urgent);
Comment faut-il réutilisable fonction?
tia!
-ren
OriginalL'auteur | 2009-03-27
Vous devez vous connecter pour publier un commentaire.
Révisé réponse (après la question de clarification)
Non, il n'y a rien de plus propre que d'un plâtre. Il est plus instructif que d'un appel de méthode, moins cher, plus court etc. Il est à peu près aussi faible impact, comme on pouvait l'espérer.
Noter que si vous souhaitez écrire une méthode générique pour la conversion, vous devez spécifier les éléments à convertir ainsi: l'énumération pourrait être basé sur
byte
oulong
par exemple. En mettant dans la fonte, vous explicitement dire ce que vous souhaitez convertir, et il le fait.Réponse originale à cette question
Qu'entendez-vous par "index" exactement? Entendez-vous la valeur numérique? Les jeter à
int
. Si vous voulez dire "poste au sein de l'enum" il faudrait s'assurer que les valeurs sont dans l'ordre numérique (car c'est ceEnum.GetValues
donne pas l'ordre de déclaration), et alors:Vous avez raison. C'était une idée stupide. Je suis emporté lors de la construction d'un EnumHelper classe.
OriginalL'auteur Jon Skeet
Vous pouvez trouver la valeur de l'entier d'un enum par casting:
OriginalL'auteur Smashery
Le plus générique que je connaisse, c'est de lire le
value__
champ à l'aide de la réflexion.Cette approche ne fait aucune hypothèse sur la enum type sous-jacent afin de travailler sur des énumérations qui ne sont pas fondées sur
Int32
.Note: j'ai uniquement testé avec Microsoft compilateur C#. C'est une honte, il ne semble pas être intégré dans la façon de le faire.
OriginalL'auteur Nathan Baulch
Je me rends compte que ce n'est pas ce que vous avez demandé, mais c'est quelque chose que vous pourriez apprécier.
J'ai découvert que vous pouvez trouver la valeur de l'entier d'un enum sans un casting, si vous savez ce que l'enum valeur minimale est de:
Ce ne serait pas travailler avec Prioritaire, sauf si vous avez ajouté quelques valeur minimale de 0, ou 1 retour:
Je trouve cette technique beaucoup plus esthétique que la conversion en int.
Je ne suis pas sûr du haut de ma tête ce qui se passe si vous avez une énumération basée sur l'octet ou longue, je soupçonne que vous obtiendriez byte ou long valeurs de la différence.
Cela suppose aussi que les valeurs enum sont contigus (est-ce le mot?), et de commencer à une valeur connue, et sont dans le bon ordre. Essayez
enum DealBreaker { First=3, Second=1, Third=19 }
. Oh, et que l'enum n'a pas l' [Drapeaux] attribut.OriginalL'auteur Mark Maxham
Si vous voulez la valeur, vous pouvez juste lancer la enum type int. Qui voudrait mettre complexityValueToStore == 1 et priorityValueToStore == 4.
Si vous souhaitez obtenir l'index (c'est à dire: la Priorité.Urgent == 3), vous pouvez utiliser Enum.GetValues, puis il suffit de trouver l'index de votre enum dans cette liste. Cependant, l'ordre de l'énumération de la liste renvoyée peuvent ne pas être les mêmes que dans votre code.
Cependant, la deuxième option genre de défaites le but d'Enum en premier lieu, vous essayez de valeurs discrètes plutôt que des listes et des indices. J'avais repenser à vos besoins si vous le souhaitez.
OriginalL'auteur Reed Copsey
C'est le moyen le plus simple pour résoudre votre problème:
Cela fonctionne pour moi.
OriginalL'auteur Fernando Teles