Question Comment convertir une chaîne en une énumération en C #?


Quel est le meilleur moyen de convertir une chaîne en une valeur d'énumération en C #?

J'ai une balise de sélection HTML contenant les valeurs d'une énumération. Lorsque la page est publiée, je veux récupérer la valeur (qui sera sous la forme d'une chaîne) et la convertir en valeur d'énumération.

Dans un monde idéal, je pourrais faire quelque chose comme ça:

StatusEnum MyStatus = StatusEnum.Parse("Active");

mais ce n'est pas un code valide.


549
2017-08-19 12:51


origine


Réponses:


En .NET Core et .NET> 4 il y a une méthode d'analyse générique:

Enum.TryParse("Active", out StatusEnum myStatus);

Cela inclut également la nouvelle version de C # 7 out variables, donc cela fait le try-parse, la conversion au type enum explicite et initialise + remplit le myStatus variable.

Si vous avez accès à C # 7 et au dernier .NET, c'est le meilleur moyen.

Réponse originale

En .NET c'est plutôt moche (jusqu'à 4 ou plus):

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

J'ai tendance à simplifier cela avec:

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

Alors je peux faire:

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

Une option suggérée dans les commentaires est d'ajouter une extension, ce qui est assez simple:

public static T ToEnum<T>(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

Enfin, vous souhaiterez peut-être utiliser une énumération par défaut si la chaîne ne peut pas être analysée:

public static T ToEnum<T>(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

Ce qui en fait l'appel:

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

Cependant, je ferais attention en ajoutant une méthode d'extension comme celle-ci string comme (sans contrôle d'espace de noms) il apparaîtra sur toutes les instances de string qu'ils tiennent une enum ou non (donc 1234.ToString().ToEnum(StatusEnum.None) serait valide mais absurde). Il est souvent préférable d'éviter d'encombrer les classes principales de Microsoft avec des méthodes supplémentaires qui ne s'appliquent que dans des contextes très spécifiques, à moins que votre équipe de développement ne comprenne très bien ce que ces extensions font.


941
2017-08-19 12:54



Utilisation Enum.TryParse<T>(String, T) (≥ .NET 4.0):

StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);

Il peut être encore simplifié avec C # 7.0 type de paramètre en ligne:

Enum.TryParse("Active", out StatusEnum myStatus);

237
2017-12-05 08:22



Notez que les performances de Enum.Parse () sont terribles, car elles sont implémentées via la réflexion. (La même chose est vraie pour Enum.ToString, ce qui va dans l'autre sens.)

Si vous devez convertir des chaînes en Enums dans un code sensible aux performances, le mieux est de créer un Dictionary<String,YourEnum> au démarrage et utilisez-le pour effectuer vos conversions.


160
2017-09-02 02:27



Vous cherchez Enum.Parse.

SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");

68
2017-08-19 12:53



Vous pouvez utiliser méthodes d'extension à présent:

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

Et vous pouvez les appeler par le code ci-dessous (ici, FilterType est un type enum):

FilterType filterType = type.ToEnum<FilterType>();

21
2018-02-10 10:12



object Enum.Parse(System.Type enumType, string value, bool ignoreCase);

Donc, si vous aviez une atmosphère nommée enum, cela ressemblerait à ceci:

   enum Mood
   {
      Angry,
      Happy,
      Sad
   } 

   // ...
   Mood m = (Mood) Enum.Parse(typeof(Mood), "Happy", true);
   Console.WriteLine("My mood is: {0}", m.ToString());

14
2017-08-19 12:58



Enum.Parse est votre ami:

StatusEnum MyStatus = (StatusEnum)Enum.Parse(typeof(StatusEnum), "Active");

12
2017-08-19 12:55