J'ai une classe appelée Questions
(pluriel). Dans cette classe, il y a une énumération appelée Question
(singulier) qui ressemble à ceci.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
Dans la Questions
classe, j'ai une get(int foo)
fonction qui renvoie un Questions
objet pour cela foo
. Existe-t-il un moyen facile de retirer la valeur entière de l'énumération pour que je puisse faire quelque chose comme ça Questions.Get(Question.Role)
?
get(int foo)
vous pouvez la définir commeget(Question foo)
vous le feriez pour votre casting à l'intérieur de la méthode, vous pouvez appeler votre méthode commeQuestions.Get(Question.Role)
Réponses:
Il suffit de lancer l'énumération, par exemple
Ce qui précède fonctionnera pour la grande majorité des énumérations que vous voyez dans la nature, comme le type sous-jacent par défaut pour une énumération
int
.Cependant, comme le souligne cecilphillip , les énumérations peuvent avoir différents types sous-jacents. Si une ENUM est déclarée comme
uint
,long
ouulong
, il doit être jeté au type de ENUM; par exemple pourTu devrais utiliser
la source
enum Test { Item = 1 }
et voir que1 == (int)Test.Item
c'est égal.(int)Test.Item
C'est un casting! () est l'opérateur de transtypage explicite.enum Question
n'était pasint
maislong
cette conversion tronquera laRole
valeur intégrale de s!Enum
comme paramètre, vous savez que vous ne pouvez obtenir qu'un nombre fixe de valeurs intégrales possibles. D'un autre côté, si vous prenez simplement unint
, alors vous devez valider si c'estint
dans les valeurs acceptées., Compliquant ainsi 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 énumérations peut être tout type intégral (
byte
,int
,short
, etc.), d' une manière plus robuste pour obtenir la valeur intégrale sous - jacente de l'ENUM serait d'utiliser laGetTypeCode
méthode en conjonction avec laConvert
classe:Cela devrait fonctionner quel que soit le type intégral sous-jacent.
la source
var
est de typeobject
, vous devez donc le déballer et cela devient plus compliqué que je ne le voudrais.object val = Convert...etc
levar
sera toujours dans votre exempleobject
.Déclarez-le comme une classe statique ayant des constantes publiques:
Et puis vous pouvez le référencer en tant que
Question.Role
, et il évalue toujours unint
ou quoi que vous le définissiez comme.la source
static readonly int
parce que les constantes sont compilées dans leurs valeurs dures. Voir stackoverflow.com/a/755693/492const
et non passtatic readonly
parce que chaque fois que vous comparez,static readonly
vous effectuez un appel de méthode pour obtenir la valeur de la variable alors qu'avec unconst
vous comparez directement deux types de valeur.compilation limitation
je veux dire que la valeur est codée en dur lorsque vous la compilez, donc toute modification de cette valeur nécessiterait que tous les assemblys l'utilisant doivent être recompilés. Je suis enclin à être d'accord avec vous sur l'utilisation, car la modification des valeurs aurait des implications importantes.Se traduira par
value == 2
.la source
Sur une note connexe, si vous souhaitez obtenir la
int
valeur deSystem.Enum
, alors donnée
ici:Vous pouvez utiliser:
Les deux derniers sont tout simplement laids. Je préfère le premier.
la source
C'est plus facile que vous ne le pensez - une énumération est déjà un int. Il suffit de le rappeler:
la source
Exemple:
Et dans le code derrière pour obtenir la valeur enum:
ou
Les énumérations incrémentent de 1 et vous pouvez définir la valeur de départ. Si vous ne définissez pas la valeur de départ, elle sera affectée initialement à 0.
la source
1
à l'int
exception que vous définissez explicitement le contraireJ'ai récemment converti l'utilisation d'énumérations dans mon code en faveur de l'utilisation de classes avec des constructeurs protégés et des instances statiques prédéfinies (grâce à Roelof - C # Assurer des valeurs d'énumération valides - Méthode Futureproof ).
À la lumière de cela, voici comment j'aborderais maintenant ce problème (y compris la conversion implicite vers / depuis
int
).L'avantage de cette approche est que vous obtenez tout ce que vous auriez de l'énumération, mais votre code est maintenant beaucoup plus flexible, donc si vous devez effectuer différentes actions en fonction de la valeur de
Question
, vous pouvez mettre la logique enQuestion
elle-même (c'est-à-dire dans l'OO préféré au lieu de mettre beaucoup de déclarations de cas dans votre code pour aborder chaque scénario.NB: Réponse mise à jour le 2018-04-27 pour utiliser les fonctionnalités C # 6; c'est-à-dire les expressions de déclaration et les définitions de corps d'expression lambda. Voir l' historique des révisions pour le code d'origine. Cela a l'avantage de rendre la définition un peu moins détaillée; qui avait été l'une des principales plaintes concernant l'approche de cette réponse.
la source
Si vous voulez obtenir un entier pour la valeur enum qui est stockée dans une variable, dont le type serait
Question
, à utiliser par exemple dans une méthode, vous pouvez simplement le faire, j'ai écrit dans cet exemple:Cela changera le titre de la fenêtre en 4, car la variable
Geselecteerd
estTalen.Nederlands
. Si je le change enTalen.Portugees
et rappelle la méthode, le texte changera en 3.la source
Pour vous assurer qu'une valeur d'énumération existe, puis l'analyser, vous pouvez également procéder comme suit.
la source
Peut-être que je l'ai manqué, mais quelqu'un a-t-il essayé une méthode d'extension générique simple?
Cela fonctionne très bien pour moi. Vous pouvez éviter le transtypage de type dans votre API de cette façon, mais au final, il en résulte une opération de changement de type. C'est un bon cas pour programmer Roslyn pour que le compilateur crée une méthode GetValue <T> pour vous.
la source
Une autre façon de le faire:
Il en résultera:
la source
... est une belle déclaration.
Vous devez convertir le résultat en entier comme suit:
Sinon, le type est toujours
QuestionType
.Ce niveau de rigueur est la voie C #.
Une alternative consiste à utiliser une déclaration de classe à la place:
C'est moins élégant à déclarer, mais vous n'avez pas besoin de le convertir en code:
Vous pouvez également vous sentir plus à l'aise avec Visual Basic, qui répond à ce type d'attente dans de nombreux domaines.
la source
number
devrait avoir la valeur2
.la source
bool
*,byte
,ushort
,int
etuint
**. Le GetHashCode pour d'autres types modifie la valeur, par exemple fait quelques décalages de bits et xors. (* 1/0, ** casté en int bien sûr). Mais dans l'ensemble, ne faites pas cela sauf s'il s'agit de votre propre code privé.Vous pouvez le faire en implémentant une méthode d'extension à votre type d'énumération défini:
Cela simplifie l'obtention de la valeur int de la valeur d'énumération actuelle:
ou
la source
Utilisez plutôt une méthode d'extension:
Et l'utilisation est un peu plus jolie:
la source
la source
Utilisation:
Il en résultera
value == 2
.Cela n'est vrai que si l'énumération s'inscrit dans un
int
.la source
int
bien sûr, carGetHashCode
renvoie un entier.Étant donné que les énumérations peuvent être déclarées avec plusieurs types primitifs, une méthode d'extension générique pour convertir n'importe quel type d'énumération peut être utile.
la source
Voici la méthode d'extension
la source
Mon hack préféré avec des énumérations int ou plus petites:
Pour une énumération
Cette,
les sorties
Avertissement:
Cela ne fonctionne pas pour les énumérations basées sur une longue.
la source
La solution la plus simple à laquelle je peux penser est de surcharger la
Get(int)
méthode comme ceci:où
[modifiers]
peut généralement être le même que pour laGet(int)
méthode. Si vous ne pouvez pas modifier laQuestions
classe ou pour une raison quelconque ne le souhaitez pas, vous pouvez surcharger la méthode en écrivant une extension:la source
L'exemple que je voudrais suggérer "pour obtenir une valeur" int "à partir d'une énumération", est
Maintenant, la réponse sera 1.
la source
Utilisation:
la source
Essayez celui-ci au lieu de convertir enum en int:
la source
En Visual Basic, il devrait être:
la source
Je suis venu avec cette méthode d'extension qui inclut les fonctionnalités du langage actuel. En utilisant dynamique, je n'ai pas besoin d'en faire une méthode générique et de spécifier le type qui maintient l'invocation plus simple et cohérente:
la source