175 votes

convertir une énumération en un autre type d'énumération

J'ai un enum, par exemple 'Sexe' (Homme = 0, Femme = 1) et un autre enum d'un service qui a son propre enum Genre (Homme = 0, Femme = 1, Inconnu = 2)

Ma question est comment puis-je écrire quelque chose de rapide et agréable pour convertir de leur enum à la mienne?

315voto

Marc Gravell Points 482669

Étant donné Enum1 value = ... , alors si vous voulez dire par nom:

 Enum2 value2 = (Enum2) Enum.Parse(typeof(Enum2), value.ToString());
 

Si vous voulez dire par valeur numérique, vous pouvez généralement simplement lancer:

 Enum2 value2 = (Enum2)value;
 

(avec le casting, vous pouvez utiliser Enum.IsDefined pour vérifier les valeurs valides, cependant)

105voto

Zooba Points 6440

Utiliser une méthode d'extension fonctionne assez bien avec les deux méthodes de conversion suggérées par Nate:

 public static class TheirGenderExtensions
{
    public static MyGender ToMyGender(this TheirGender value)
    {
        // insert switch statement here
    }
}

public static class MyGenderExtensions
{
    public static TheirGender ToTheirGender(this MyGender value)
    {
        // insert switch statement here
    }
}
 

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 selon les classes / structures / énumérations auxquelles elles s'appliquent.

60voto

AZ. Points 3712

Il suffit de transtyper un pour int puis de le rediriger vers l'autre énumération (en considérant que vous souhaitez que le mappage soit effectué en fonction de la valeur):

 Gender2 gender2 = (Gender2)((int)gender1);
 

24voto

Nate C-K Points 3749

Pour être complet, j'ai l'habitude de créer une paire de fonctions, qui prend Enum 1 et renvoie Enum 2 et un autre qui prend Enum 2 et retourne Enum 1. Chacun se compose d'un cas exposé les intrants, les extrants et les cas de défaut déclenche une exception avec un message se plaindre d'une valeur inattendue.

Dans ce cas particulier vous pouvez prendre avantage du fait que les valeurs entières d'Hommes et de Femmes sont les mêmes, mais je voudrais éviter qu'il en est hackish et soumis à la casse si enum changements dans l'avenir.

14voto

TheSuperTramp Points 5641

Vous pourriez écrire une méthode d'extension générique simple comme celle-ci

 public static T ConvertTo<T>(this object value)            
    where T : struct,IConvertible
{
    var sourceType = value.GetType();
    if (!sourceType.IsEnum)
        throw new ArgumentException("Source type is not enum");
    if (!typeof(T).IsEnum)
        throw new ArgumentException("Destination type is not enum");
    return (T)Enum.Parse(typeof(T), value.ToString());
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X