Obtenez de l'int valeur d'enum en C#
J'ai une classe appelée Questions
(au pluriel). Dans cette classe il y a un enum appelé Question
(au singulier) qui ressemble à ceci.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
Dans le Questions
classe, j'ai un get(int foo)
une fonction qui retourne un Questions
objet pour que foo
. Est-il un moyen facile pour obtenir la valeur de l'entier de l'enum si je peux faire quelque chose comme Questions.Get(Question.Role)
?
- Pour l'autre sens: cast-int-to-enum-in-c-sharp.
- Je sais je suis en retard à la fête, mais au lieu de définir votre méthode de
get(int foo)
vous pouvez le définir commeget(Question foo)
ensuite, faites votre casting à l'intérieur de la méthode, vous pouvez appeler votre méthodeQuestions.Get(Question.Role)
Vous devez vous connecter pour publier un commentaire.
Juste lancer la enum, par exemple
Ci-dessus va travailler pour la grande majorité des enums vous voyez dans la nature, comme la valeur par défaut type sous-jacent pour un enum est
int
.Cependant, comme cecilphillip souligne, les énumérations peuvent avoir différents types de sous-jacents.
Si un enum est déclaré comme un
uint
,long
, ouulong
, il doit être converti dans le type de l'enum; par exemple pourvous devez utiliser
enum Test { Item = 1 }
et de voir que1 == (int)Test.Item
est égal.enum Question
n'était pasint
maislong
cette distribution sera tronquée,Role
s valeur intégrale!Enum
en tant que paramètre, vous connaissez n'est qu'un nombre fixe de possible intégrante des valeurs que vous pouvez obtenir. D'autre part, si vous prenez simplement unint
, alors vous devez valider si cetteint
est dans les valeurs acceptées., ce qui complique le code. Vous pouvez toujours remplacer vos signatures comme ` public void MyMethod(int x) { // faire quelque chose avec x } public void MyMethod(Enum x) { this.MyMethod((int) x); } ``Depuis les Énumérations peuvent être n'importe quel type intégral (
byte
,int
,short
, etc.), d'une façon plus robuste pour obtenir le sous-jacent partie intégrante de la valeur de l'enum serait de faire usage de laGetTypeCode
méthode en conjonction avec laConvert
classe:Cela devrait fonctionner quel que soit le sous-jacent de type intégral.
var
est de typeobject
, de sorte que vous devez unbox et il devient plus problématique que je voudrais.object val = Convert...etc
lavar
dans votre exemple sera toujoursobject
.object
) de type entier n'est pas très utile lorsque vous ne connaissez pas la largeur de l'entier de type à la compilation! Si vous voulez juste pour écrire la valeur numérique, l'utilisationSides side = Sides.Bottom; Console.WriteLine("{0:D}", side);
. Si vous voulez une référence à la chaîne, c'est-àstring sideStr = side.ToString("D");
. Et pour répondre au commentaire de @MarkLakata, il suffit d'utiliserX
au lieu deD
, c'est-àConsole.WriteLine("{0:X}", side)
ouside.ToString("X")
. Un bas-de-cassex
donne hexadécimal avec des minuscules des chiffresa
parf
.Le déclarer comme une classe statique qui ont des constantes:
Et vous pouvez y faire référence en tant que
Question.Role
, et il évalue toujours à unint
ou ce que vous définissez comme.static readonly int
parce que les constantes sont compilés dans leur dur valeurs. Voir stackoverflow.com/a/755693/492const
et passtatic readonly
parce que chaque fois que vous comparezstatic readonly
vous faites un appel de méthode pour obtenir la valeur de la variable, alors qu'avec unconst
vous êtes à la comparaison de deux types de valeur directement.static readonly int
parce que vous chargez les valeurs de dynamique à partir d'un fichier de paramètres ou de quelque chose? Je pense que si vous utilisez cette classe statique en place d'un enum qu'il devrait être unconst
parce que les valeurs ne changent pas.compilation limitation
je veux dire que la valeur est codée en dur lorsque vous compilez-il si, tout changement de prix, il faudra que tous assemblées à l'aide de ce besoin d'être recompilées. Je suis plutôt d'accord avec vous à propos de l'usage parce que changer les valeurs aurait de profondes répercussions.Entraînera
value == 2
.Sur une note, si vous voulez obtenir le
int
valeur deSystem.Enum
, étant donnée
ici:Vous pouvez utiliser:
Les deux derniers sont laid. Je préfère la première.
Il est plus facile que vous le pensez - un enum est déjà un int. Il a juste besoin d'être rappelé:
Exemple:
Et dans le code-behind pour obtenir la valeur d'enum:
ou
Enums s'incrémente de 1, et vous pouvez définir la valeur de départ. Si vous ne définissez pas la valeur de départ, il sera attribué à 0 au départ.
Raj = 1
, etPublic Enum
devrait êtrepublic enum
J'ai récemment converti à l'écart de l'utilisation des enums dans mon code en faveur de la place à l'aide de classes protégés, les constructeurs et les prédéfinis statique instances (grâce à Roelof - C# Assurer La Validité Des Valeurs Enum - Futureproof Méthode).
À la lumière de cela, ci-dessous comment j'aimerais maintenant aborder cette question (y compris la conversion implicite vers/à partir de
int
).L'avantage de cette approche est que vous obtenez tout ce que vous avez de l'enum, mais votre code est maintenant beaucoup plus souple, donc si vous avez besoin d'effectuer des actions différentes en fonction de la valeur de
Question
, vous pouvez mettre de la logique dansQuestion
lui-même (c'est à dire dans le préféré OO mode) plutôt que de mettre beaucoup de cas, les déclarations tout au long de votre code pour attaquer chaque scénario.NB: Réponse mis à jour 2018-04-27 de rendre l'utilisation de C# 6 fonctions; c'est à dire la déclaration des expressions lambda et l'expression du corps définitions. Voir révision de l'histoire pour le code original. Cela a l'avantage de rendre la définition un peu moins verbeux; qui avait été l'un des principaux griefs à propos de cette réponse de l'approche.
Si vous voulez obtenir un entier pour les enum valeur qui est stockée dans une variable dont le type serait
Question
, à utiliser par exemple dans une méthode, vous pouvez simplement faire ce que j'ai écrit dans cet exemple:Cela va changer le titre de la fenêtre à 4 parce que la variable
Geselecteerd
estTalen.Nederlands
. Si je l'ai changer pourTalen.Portugees
et l'appel à la méthode de nouveau, le texte change pour 3.J'ai eu du mal à trouver cette solution simple sur internet et je ne pouvais pas le trouver, j'ai été le tester quelque chose et ne la trouve. Espérons que cette aide. 😉
Pour assurer une valeur d'enum existe avant de l'analyser, vous pouvez également effectuer les opérations suivantes.
J'espère que cette aide.
Un moyen de plus pour le faire:
Permettra:
Peut-être que j'ai manqué, mais quelqu'un a déjà essayé un simple générique de la méthode d'extension. Cela fonctionne très bien pour moi. Vous pouvez éviter le type de fonte dans votre API de cette façon, mais en fin de compte elle entraîne un changement du type d'opération. C'est une bonne affaire pour la programmation de Roselyn que le compilateur faire une méthode GetValue pour vous.
...est une belle déclaration.
Vous avez à jeter la suite de l'int de la sorte:
Autrement, le type est toujours
QuestionType
.Ce niveau de rigueur est le C# chemin.
Une alternative est d'utiliser une déclaration de classe à la place:
C'est moins élégant à déclarer, mais vous n'avez pas besoin de le jeter dans le code:
Alternativement, vous pouvez vous sentir plus à l'aise avec Visual Basic, ce qui convient pour ce type d'attente dans de nombreux domaines.
number
doit avoir la valeur de2
.Vous pouvez le faire en mettant en œuvre une Méthode d'Extension à votre défini type enum:
Ce simplifier la mise en int valeur actuelle de la valeur d'enum:
ou
Comment sur une extension de la méthode à la place:
Et l'utilisation est un peu plus joli:
Mes fav hack avec des int ou des petits énumérations:
Pour un enum
ce
sorties
Avertissement:
Ne fonctionne pas pour les énumérations, basée sur de longues
Suivant est la méthode d'extension
L'exemple, je voudrais suggérer "pour obtenir des" int " la valeur de l'enum est,'
maintenant la réponse sera 1.
J'espère que cela peut aider quelqu'un.
Depuis les énumérations peuvent être déclarés avec plusieurs types primitifs, une extension générique de la méthode de jeter un type enum peut être utile.
La solution la plus simple je pense est de surcharger le
Get(int)
méthode comme ceci:où
[modifiers]
peuvent généralement être la même que pourGet(int)
méthode. Si Vous ne pouvez pas modifier leQuestions
classe ou pour une raison quelconque ne le souhaitez pas, Vous pouvez surcharger la méthode par l'écriture d'une extension:Essayer celui-ci, au lieu de convertir enum pour int:
En Vb. Il devrait être
J'ai un peu de retard pour le jeu, mais je suis venu avec cette méthode d'extension qui comprend les fonctionnalités de la langue. En utilisant dynamique, je n'ai pas besoin de faire cette méthode générique et de spécifier le type qui maintient l'invocation simple et cohérente. S'il vous plaît laissez-moi savoir si j'ai fait quelque chose de mal:
Essayez ceci :