Comment convertir un int
an enum
en C #?
3196
À partir d'une chaîne:
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}
D'un int:
YourEnum foo = (YourEnum)yourInt;
Mise à jour:
De nombre, vous pouvez également
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
est dynamique et ne sera connu qu'au moment de l'exécution, et que je veux convertirEnum
?var result = Enum.TryParse(yourString, out yourEnum)
nos jours (et vérifier le résultat pour déterminer si la conversion a échoué).Enum.Parse
été insensible à la casse en ajoutant unetrue
valeur de paramètre à l'appel:YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Il suffit de le lancer:
Vous pouvez vérifier si elle est à portée en utilisant Enum.IsDefined :
la source
Enum.IsDefined
, sachez que cela peut être dangereux: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
pour vérifier les valeurs d'entrée, vous vous exposez aux personnes qui ajoutent de nouvelles valeurs d'énumération plus tard qui passeraient unIsDefined
contrôle (depuis la nouvelle existe dans le nouveau code), mais qui pourrait ne pas fonctionner avec le code d'origine que vous avez écrit. Il est donc plus sûr de spécifier explicitement les valeurs d'énumération que votre code est capable de gérer.Vous pouvez également utiliser une méthode d'extension au lieu d'une ligne unique:
Usage:
OU
la source
System.String
semble être une pollution d'espace de nomsJe pense que pour obtenir une réponse complète, les gens doivent savoir comment les énumérations fonctionnent en interne dans .NET.
Comment ça marche
Une énumération dans .NET est une structure qui mappe un ensemble de valeurs (champs) à un type de base (la valeur par défaut est
int
). Cependant, vous pouvez réellement choisir le type intégral auquel votre enum mappe:Dans ce cas, l'énumération est mappée à la
short
type de données, ce qui signifie qu'elle sera stockée en mémoire sous la forme d'un court métrage et se comportera comme un court métrage lorsque vous la transtyperez et l'utiliserez.Si vous le regardez d'un point de vue IL, une énumération (normale, int) ressemble à ceci:
Ce qui devrait attirer votre attention ici, c'est que le
value__
est stocké séparément des valeurs d'énumération. Dans le cas de l'énumérationFoo
ci-dessus, le type devalue__
est int16. Cela signifie essentiellement que vous pouvez stocker tout ce que vous voulez dans une énumération, tant que les types correspondent .À ce stade, je voudrais souligner qu'il
System.Enum
s'agit d'un type de valeur, ce qui signifie essentiellement qu'ilBarFlag
prendra 4 octets en mémoire etFoo
en prendra 2 - par exemple, la taille du type sous-jacent (c'est en fait plus compliqué que cela, mais Hey...).La réponse
Donc, si vous avez un entier que vous souhaitez mapper à une énumération, le runtime n'a qu'à faire 2 choses: copier les 4 octets et lui donner un autre nom (le nom de l'énumération). La copie est implicite car les données sont stockées en tant que type de valeur - cela signifie essentiellement que si vous utilisez du code non managé, vous pouvez simplement échanger des énumérations et des entiers sans copier les données.
Pour le rendre sûr, je pense que c'est une meilleure pratique de savoir que les types sous-jacents sont les mêmes ou implicitement convertibles et de s'assurer que les valeurs d'énumération existent (elles ne sont pas vérifiées par défaut!).
Pour voir comment cela fonctionne, essayez le code suivant:
Notez que le casting
e2
fonctionne également! Du point de vue du compilateur ci-dessus, cela a du sens: levalue__
champ est simplement rempli de 5 ou 6 et lors desConsole.WriteLine
appelsToString()
, le nom dee1
est résolu tandis que le nom dee2
ne l'est pas.Si ce n'est pas ce que vous vouliez, utilisez
Enum.IsDefined(typeof(MyEnum), 6)
pour vérifier si la valeur que vous convertissez correspond à une énumération définie.Notez également que je suis explicite sur le type sous-jacent de l'énumération, même si le compilateur vérifie réellement cela. Je fais cela pour m'assurer de ne pas rencontrer de surprises sur la route. Pour voir ces surprises en action, vous pouvez utiliser le code suivant (en fait, j'ai vu cela se produire souvent dans le code de la base de données):
la source
int
! =short
, Il lancera (le déballage échoue). Si vous le faitesobject o = (short)5;
, cela fonctionnera, car alors les types correspondront. Ce n'est pas une question de gamme, c'est vraiment une question de type.Prenons l'exemple suivant:
la source
J'utilise ce morceau de code pour convertir l'intégralité de mon enum:
Je trouve que c'est la meilleure solution.
la source
Vous trouverez ci-dessous une belle classe utilitaire pour Enums
la source
Pour les valeurs numériques, cela est plus sûr car il retournera un objet quoi qu'il arrive:
la source
Si vous êtes prêt pour le 4.0 .NET Framework, il y a une nouvelle fonction Enum.TryParse () qui est très utile et joue bien avec l'attribut [Flags]. Voir Enum.TryParse, méthode (String, TEnum%)
la source
Si vous avez un entier qui agit comme un masque de bits et pourrait représenter une ou plusieurs valeurs dans une énumération [Indicateurs], vous pouvez utiliser ce code pour analyser les valeurs d'indicateur individuelles dans une liste:
Notez que cela suppose que le type sous-jacent de
enum
est un entier signé 32 bits. S'il s'agissait d'un type numérique différent, vous devriez changer le 32 codé en dur pour refléter les bits de ce type (ou le dériver par programmation en utilisantEnum.GetUnderlyingType()
)la source
Parfois, vous avez un objet du
MyEnum
type. CommeAlors:
la source
Il s'agit d'une méthode de conversion sûre compatible avec l'énumération des drapeaux:
la source
Enum
place destruct
, ce qui signifie que nous n'avons pas à nous fier à la vérification de l'exécution!Pour convertir une chaîne en ENUM ou int en constante ENUM, nous devons utiliser la fonction Enum.Parse. Voici une vidéo youtube https://www.youtube.com/watch?v=4nhx4VwdRDk qui démontre réellement la chaîne avec la même chose pour int.
Le code va comme indiqué ci-dessous où "rouge" est la chaîne et "MyColors" est la couleur ENUM qui a les constantes de couleur.
la source
S'éloignant légèrement de la question d'origine, mais j'ai trouvé une réponse à la question Stack Overflow Obtenir la valeur int de enum utile. Créez une classe statique avec des
public const int
propriétés, ce qui vous permet de rassembler facilement un tas deint
constantes connexes , sans avoir à les convertirint
lors de leur utilisation.Évidemment, certaines des fonctionnalités de type enum seront perdues, mais pour stocker un tas de constantes d'ID de base de données, cela semble être une solution assez ordonnée.
la source
Cela analyse les entiers ou les chaînes en une énumération cible avec une correspondance partielle dans dot.NET 4.0 en utilisant des génériques comme dans la classe d'utilité de Tawani ci-dessus. Je l'utilise pour convertir des variables de commutateur de ligne de commande qui peuvent être incomplètes. Puisqu'une énumération ne peut pas être nulle, vous devez logiquement fournir une valeur par défaut. Il peut être appelé comme ceci:
Voici le code:
FYI: La question portait sur les entiers, que personne n'a mentionné convertira également explicitement dans Enum.TryParse ()
la source
À partir d'une chaîne: (Enum.Parse est obsolète, utilisez Enum.TryParse)
la source
Voici une méthode d'extension légèrement meilleure
la source
Dans mon cas, je devais retourner l'énumération d'un service WCF. J'avais également besoin d'un nom convivial, pas seulement de l'énum.ToString ().
Voici ma classe WCF.
Voici la méthode d'extension qui obtient la description de l'énumération.
La mise en oeuvre:
la source
Je ne sais plus où obtenir la partie de cette extension enum, mais elle provient de stackoverflow. Je suis désolé pour cela! Mais j'ai pris celui-ci et l'ai modifié pour des énumérations avec des drapeaux. Pour les énumérations avec des drapeaux, j'ai fait ceci:
Exemple:
la source
Vous devez intégrer une relaxation de correspondance de type pour être plus robuste.
Cas de test
la source
Différentes façons de diffuser vers et depuis
Enum
la source
Il peut vous aider à convertir toutes les données d'entrée en énumération souhaitée par l'utilisateur . Supposons que vous ayez une énumération comme ci-dessous qui par défaut int . Veuillez ajouter une valeur par défaut au premier de votre énumération. Qui est utilisé chez helpers medthod lorsqu'aucune correspondance n'est trouvée avec la valeur d'entrée.
NB: Ici, j'essaie d'analyser la valeur en int, car enum est par défaut int Si vous définissez enum comme celui-ci qui est de type octet .
Vous devez modifier l'analyse syntaxique à la méthode d'assistance de
à
byte.TryParse(value.ToString(), out tempType)
Je vérifie ma méthode pour les entrées suivantes
Désolé pour mon anglais
la source
Voici une méthode d'extension qui se transforme
Int32
enEnum
.Il honore les drapeaux au niveau du bit même lorsque la valeur est supérieure au maximum possible. Par exemple, si vous avez une énumération avec les possibilités 1 , 2 et 4 , mais que l'int est 9 , il comprend cela comme 1 en l'absence de 8 . Cela vous permet d'effectuer des mises à jour des données avant les mises à jour du code.
la source
la manière simple et claire de convertir un int enum en c #:
la source
Vous utilisez simplement la conversion explicite Cast int en enum ou enum to int
la source
la source
Vous faites juste comme ci-dessous:
Pour vous assurer que vous convertissez uniquement les bonnes valeurs et que vous pouvez lever une exception dans le cas contraire:
Notez que l'utilisation d'IsDefined est coûteuse et même plus que le simple casting, donc cela dépend de votre implémentation pour décider de l'utiliser ou non.
la source
Vous pouvez utiliser la méthode d'extension.
utiliser comme code ci-dessous
énumération:
Utilisation:
la source