HOWTO · Csharp

Convertir Enum en chaîne en C#

Pour convertir une valeur d’énumération en chaîne en C#, `ToString()` renvoie le nom du membre. Pour afficher un libellé personnalisé, utilisez `DescriptionAttribute` pour l’associer à la déclaration de l’énumération, ou une instruction `switch` pour définir explicitement la correspondance.

Sur cette page

Une valeur d’énumération peut être convertie en chaîne de plusieurs façons, selon que vous souhaitez obtenir son nom déclaré ou une étiquette distincte destinée aux lecteurs. ToString() suffit pour obtenir le nom du membre. Utilisez DescriptionAttribute si les étiquettes doivent figurer à côté des déclarations de l’énumération, ou une instruction switch si vous préférez garder la correspondance explicite. Les exemples ci-dessous présentent les compromis et le comportement obtenu lorsqu’une valeur n’a pas d’étiquette personnalisée. (C#)

Convertir une valeur d’énumération en chaîne avec ToString()

Appeler ToString() sur une énumération renvoie le nom de son membre déclaré. C’est utile pour les journaux, le diagnostic et les interfaces où des noms comme InProgress conviennent comme texte affiché. La méthode n’ajoute pas d’espaces et ne modifie pas la casse. Console.WriteLine convertit également une valeur d’énumération en son nom, mais appeler ToString() rend la conversion explicite lorsque vous affectez le résultat à une chaîne.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

using System;

enum Status { InProgress, Completed }

class Program
{
    static void Main()
    {
        Status status = Status.Completed;
        string name = status.ToString();
        Console.WriteLine(name);
    }
}

Pour cette valeur déclarée, le programme affiche Completed. Une valeur numérique qui ne correspond à aucun membre déclaré est représentée par son nombre. Pour une énumération à indicateurs, ToString() peut afficher les noms des indicateurs correspondants réunis dans une chaîne ; la méthode ne crée pas de libellé personnalisé pour leur combinaison.

Ajouter des libellés destinés aux lecteurs avec DescriptionAttribute

Associez un DescriptionAttribute à chaque membre lorsque le libellé doit différer de son identifiant. La réflexion permet de trouver le champ correspondant à une valeur nommée et d’en lire la description. L’assistant ci-dessous renvoie le nom du membre en l’absence de description, et la représentation numérique si la valeur ne correspond à aucun champ déclaré.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

using System;
using System.ComponentModel;
using System.Reflection;

enum Status
{
    [Description("In progress")]
    InProgress,
    [Description("Successfully completed")]
    Completed
}

static class EnumLabels
{
    public static string GetLabel(Status value)
    {
        string name = Enum.GetName(typeof(Status), value);
        if (name == null)
            return value.ToString();

        FieldInfo field = typeof(Status).GetField(name);
        DescriptionAttribute attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(
            field, typeof(DescriptionAttribute));
        return attribute == null ? name : attribute.Description;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(EnumLabels.GetLabel(Status.Completed));
    }
}

Cette approche place les libellés à côté des membres de l’énumération, mais leur récupération nécessite la réflexion et il faut choisir soigneusement le comportement de repli. Dans cet exemple, une valeur numérique sans membre déclaré ne peut pas avoir d’attribut ; l’assistant renvoie donc sa représentation sous forme de chaîne numérique. Si les libellés changent souvent ou doivent être localisés, gérez cette correspondance dans la couche appropriée de l’application au lieu de traiter un attribut comme un système de localisation.

Associer des chaînes aux valeurs d’énumération avec une instruction switch

Une instruction switch présente au même endroit chaque libellé pris en charge et le comportement de repli. Elle convient à une correspondance réduite et stable, ou lorsque le texte affiché doit rester distinct de la déclaration de l’énumération. Ajoutez un cas lorsqu’un membre est ajouté ; le comportement de repli ci-dessous renvoie la représentation sous forme de chaîne par défaut de l’énumération pour toute valeur non répertoriée.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

using System;

enum Status { InProgress, Completed }

static class EnumLabels
{
    public static string GetLabel(Status value)
    {
        switch (value)
        {
            case Status.InProgress:
                return "In progress";
            case Status.Completed:
                return "Successfully completed";
            default:
                return value.ToString();
        }
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(EnumLabels.GetLabel(Status.Completed));
    }
}

Un comportement de repli explicite est important, car les variables d’énumération peuvent contenir des valeurs numériques qui ne correspondent à aucun membre déclaré. Pour une énumération à indicateurs, une combinaison peut ne correspondre à aucun cas individuel ; cette correspondance renvoie alors la représentation par défaut de l’énumération, sauf si vous ajoutez une logique pour traiter les combinaisons.

Choisir une approche et gérer les cas limites

Choisissez ToString() lorsque le nom du membre de l’énumération convient déjà. Choisissez DescriptionAttribute lorsque chaque membre possède un libellé d’affichage stable et qu’un petit assistant utilisant la réflexion est adapté. Choisissez une correspondance switch si vous préférez contrôler explicitement les libellés et le comportement de repli dans le code courant. Les exemples avec attribut et avec switch utilisent des libellés différents des identifiants de l’énumération ; aucun ne modifie la valeur de l’énumération elle-même.

Pour les deux approches avec libellés personnalisés, tenez compte des valeurs qui ne correspondent à aucun membre déclaré et des combinaisons d’indicateurs. Décidez si ces cas doivent afficher la valeur numérique ou la représentation par défaut de l’énumération, utiliser un libellé générique ou être traités par une logique dédiée. Appliquez ce choix de façon cohérente partout où la valeur est affichée. Ces approches concernent le texte d’affichage ; la sérialisation et les représentations en base de données obéissent à leurs propres contrats et doivent être configurées séparément.