J'ai une énumération de par exemple ` Gender
` ( Male =0 , Female =1
) et j'ai une autre énumération d'un service qui a sa propre énumération de genre ( Male =0 , Female =1, Unknown =2
)
Ma question est de savoir comment puis-je écrire quelque chose de rapide et agréable à convertir de leur énumération au mien?
Réponses:
L'utilisation d'une méthode d'extension fonctionne très bien, lorsque vous utilisez les deux méthodes de conversion suggérées par Nate:
De toute évidence, il n'est pas nécessaire d'utiliser des classes séparées si vous ne le souhaitez pas. Ma préférence est de garder les méthodes d'extension groupées en fonction des classes / structures / énumérations auxquelles elles s'appliquent.
la source
Étant donné
Enum1 value = ...
, alors si vous entendez par nom:Si vous entendez par valeur numérique, vous pouvez généralement simplement lancer:
(avec la distribution, vous voudrez peut-être utiliser
Enum.IsDefined
pour vérifier les valeurs valides, cependant)la source
Enum.Tryparse
:Enum2 value2 = Enum.TryParse(value.ToString(), out Enum2 outValue) ? outValue : Enum2.Unknown;
Cela vous permettra de gérer des valeurs d'entrée qui n'existent pasEnum2
sans avoir besoin d'appelerEnum.IsDefined
ou de capturer lesArgumentException
s lancées parEnum.Parse
. Notez que l'ordre des paramètres est plus ou moins inverséEnum.Parse
.Il suffit de convertir un en int, puis de le convertir en l'autre enum (en considérant que vous voulez que le mappage soit effectué en fonction de la valeur):
la source
long
(ouulong
) plutôt qu'unint
qui a des membres définis au-dessusint.MaxValue
(ou en dessous)int.MinValue
), auquel cas le cast enint
pourrait déborder et vous vous retrouveriez avec une valeur d'énumération non définie qui devrait être définie.Pour être minutieux, je crée normalement une paire de fonctions, une qui prend Enum 1 et renvoie Enum 2 et une autre qui prend Enum 2 et renvoie Enum 1. Chacune consiste en une instruction case qui mappe les entrées aux sorties et le cas par défaut lève une exception avec un message se plaignant d'une valeur inattendue.
Dans ce cas particulier, vous pouvez profiter du fait que les valeurs entières de Homme et Femme sont les mêmes, mais j'éviterais cela car c'est piraté et sujet à la rupture si l'une ou l'autre des énumérations change à l'avenir.
la source
Si nous avons:
et
Nous pouvons faire en toute sécurité
Ou même
Si vous voulez couvrir le cas où une énumération sur le côté droit du signe '=' a plus de valeurs que l'énumération sur le côté gauche - vous devrez écrire votre propre méthode / dictionnaire pour couvrir cela comme d'autres l'ont suggéré.
la source
Vous pouvez écrire une méthode d'extension générique simple comme celle-ci
la source
vous pouvez écrire une fonction simple comme celle-ci:
la source
Voici une version de la méthode d'extension si quelqu'un est intéressé
la source
la source
J'ai écrit il y a quelque temps un ensemble de méthodes d'extension qui fonctionnent pour plusieurs types différents de
Enum
s. Un en particulier fonctionne pour ce que vous essayez d'accomplir et gère lesEnum
s avec lesFlagsAttribute
ainsi que lesEnum
s avec différents types sous-jacents.De là, vous pouvez ajouter d'autres méthodes d'extension plus spécifiques.
Celui-ci changera les types de
Enum
s comme vous essayez de le faire.Soyez averti, cependant, que vous POUVEZ convertir entre n'importe lequel
Enum
et n'importe quel autre enEnum
utilisant cette méthode, même ceux qui n'ont pas d'indicateur. Par exemple:La variable
turtle
aura une valeur deTurtle.Blue
.Cependant, il y a sécurité à partir de
Enum
valeurs non définies en utilisant cette méthode. Par exemple:Dans ce cas,
access
sera défini surWriteAccess.ReadWrite
, car laWriteAccess
Enum
valeur maximale de l est 3.Un autre effet secondaire du mélange de
Enum
s avec leFlagsAttribute
et ceux qui n'en ont pas est que le processus de conversion n'entraînera pas une correspondance de 1 à 1 entre leurs valeurs.Dans ce cas,
letters
aura une valeur deLetters.H
au lieu deLetters.D
, puisque la valeur de support deFlavors.Peach
est 8. De plus, une conversion deFlavors.Cherry | Flavors.Grape
enLetters
donneraitLetters.C
, ce qui peut sembler peu intuitif.la source
Sur la base de la réponse de Justin ci-dessus, j'ai trouvé ceci:
la source
Je sais que c'est une vieille question et j'ai beaucoup de réponses, mais je trouve que l'utilisation d'une instruction switch comme dans la réponse acceptée est un peu lourde, alors voici mes 2 cents:
Ma méthode préférée personnelle est d'utiliser un dictionnaire, où la clé est l'énumération source et la valeur est l'énumération cible - donc dans le cas présenté sur la question, mon code ressemblerait à ceci:
Bien sûr, cela peut être encapsulé dans une classe statique et utilisé comme méthode d'extension:
la source
Vous pouvez utiliser ToString () pour convertir la première énumération en son nom, puis Enum.Parse () pour reconvertir la chaîne en l'autre Enum. Cela lèvera une exception si la valeur n'est pas prise en charge par l'énumération de destination (c'est-à-dire pour une valeur "inconnue")
la source