IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Les énumérations string ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 254
    Par défaut Les énumérations string ?
    Bonjour,

    Je cherche à créer un liste d'énumération composé de strings. Ce n'est pas possible à faire tel quel en C#. L'écriture suivante est fausse :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public enum Test
            {
                Test1 = "Ma valeur de test #1",
                Test2 = "Ma valeur de test #2",
                Test3 = "Ma valeur de test #3"
            }

    Dommage. J'ai donc cherché une parade et j'ai trouvé pas mal de solutions. Chacun proposant sa propre implémentation de l'enum string. Tout le monde criant qu'il y a plein de mauvaises implémentation qui traînent sur le web et que c'est bien le sienne qui est la seule vrai. Je ne sais plus quoi croire. Vous trouverez des exemples sur [ame="http://www.google.be/search?q=string+enumeration+C%23&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a"]Google[/ame]. J'ai bien aimé la solution toute simple qui consiste à utiliser un Dictionary en parallèle à son énumération.
    Je copie la solution de Coq en question ici :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    enum Test
    {
    [Description("Ma valeur de test #1")]
    Test1,
    [Description("Ma valeur de test #2")]
    Test2,
    Test3,
    }
     
    private string GetEnumValueDescription(Enum enumValue)
    {
    FieldInfo fInfo = enumValue.GetType().GetField(enumValue.ToString());
    DescriptionAttribute[] attributes = (DescriptionAttribute[])fInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
     
    if ( attributes.Length == 0)
    {
    return enumValue.ToString();
    }
    else
    {
    return attributes[0].Description;
    }
    }

    Tout simple, efficace, ça me semble parfait. Mais cette solution m'intrigue. Je me pose plusieurs questions que voici :

    1. Pourquoi cette solution ne fait elle pas l'unanimité ?
    2. La méthode utilise la réflexion. C'est pas déconseillé question performances ?
    3. Qu'est ce qu'un attribut exactement ?
    4. Et enfin, en Java à titre de comparaison, n'est il pas possible de créer des enum string ?


    Merci d'avance pour vos lumières.

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il ya de fortes chances que cette fonctionnalité n'existe pas en C# parce qu'elle n'est pas internationalisable. Coller du texte dans une enum, alors qu'une enum est un objet "métier", qui n'a pas de sens direct pour l'user, est dangereux.

    Tu dois pouvoir, pour afficher une représentation de ton enum à l'utilisateur, créer un IFormatprovider (ou un truc du style) qui implémentera une fonction ToString qui va bien.

    Et sinon, oui, pour des petits projets de tests qui n'avaient pas vocation à grossir, j'avais retenu la solution du Dictionary<MonEnum, string>, voire même plus crado :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string[] chaines = { "Zero", "Un", "Deux" };
    enum MonEnum {Zero = 0, Un = 1, Deux = 2 }
    string ToString(MonEnum e) { return chaines[(int)e]; }

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Cela dit, dans la solution que tu proposes, il suffirait d'avoir une classe de traduction pour traduire le résultat

    Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return Translater.Translate(attributes[0].Description);
    ou Translater est un objet fournissant un méthode translate qui effectue la traduction de la chaine passée en argument

    Après, la solution par reflexion, c'est pas "si" mal que cela

    Maintenant, si tu veux traduire ton texte, tu peux aussi utiliser le text fourni par le enum.toString() et ensuite, avoir un dictionnaire ou un traducteur qui fera l'association avec la bonne traduction (c'est surement c'est solution que je choisirais au final car, il vaut mieux avoir tes enums sans AUCUNE chaine associé dans le code. Le jour ou tu veux changer une traduction, tu vas être obligé de recompiler le code alors qu'avec un fichier externe de traduction ayant comme clé de traduction le ToString() de l'enum, tu n'auras qu'à modifier la traduction sans recompiler

    (si j'ai été clair)

    The Monz, Toulouse

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par DranDane Voir le message
    [*]Pourquoi cette solution ne fait elle pas l'unanimité ?
    Parce que c'est détourner les enums de leur sens premier et de leur utilité dans le grand monde de la POO

    Citation Envoyé par DranDane Voir le message
    [*]La méthode utilise la réflexion. C'est pas déconseillé question performances ?
    La réflexion est effectivement assez "lente" (enfin tout est relatif). C'est clair que si tu fait appel à ton code basé sur la reflexion 10000 fois tu vas vite comprendre pourquoi on dit que c'est lent

    Citation Envoyé par DranDane Voir le message
    [*]Qu'est ce qu'un attribut exactement ?
    http://vincentlaine.developpez.com/t...stomattributs/

    Sinon pour la solution à ton problème, si la seul chose que tu souhaites c'est un comportement similaire aux enums tu peux faire une structure avec des champs public readonly.

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Le GetCustomAttributes est une des méthodes les plus lentes du framework. La moindre des politesses dans la solution que tu nous as soumise est de mettre en cache la valeur chaîne associée à une valeur de l'enum et de ne pas rappeler GetCustomAttributes à chaque. Mais finalement cela rejoint la solution du dictionary.

    Cela dit, je rejoints l'avis des autres, une enum string est une aberration du point de vue de la conception.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/04/2006, 21h45
  2. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  3. [C#] Rassembler les chaines ( string )
    Par smyley dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/01/2005, 18h27
  4. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34
  5. Les raw strings
    Par c_kiki dans le forum Général Python
    Réponses: 1
    Dernier message: 11/11/2004, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo