Bonjour,
Vous pouvez poster dans cette discussion vos commentaires concernant l'article Introduction aux énumérations en C#.
Merci à tous.
Bonjour,
Vous pouvez poster dans cette discussion vos commentaires concernant l'article Introduction aux énumérations en C#.
Merci à tous.
Article complet, j'ajouterai deux petits éléments :
Le cast direct
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int jour = 3; FrenchDayOfWeek today = (FrenchDayOfWeek)jour; //Plus simple qu'un parse, utile quand les valeurs sont clairement maintenus (bdd avec stockage en byte)
Ainsi que la récupération de description (DescriptionAttribute), à l'aide d'une méthode d'extension (ref Dvp.net : http://dvp-net.developpez.com/doc/ht...Extensions.htm), ce deuxième point est utile pour montrer des enums plus parlant...
J'avoue, je ne savais pas qu'on pouvait faire un cast dans ce sens là aussi.
Je vais le rajouter.
Par contre DescriptionAttribute est un peu hors contexte. Peut-être pour un prochain article sur les attributs.
merci.
peut on associer un string à un enum plutot qu'un int ?
c'est la seule chose que je trouve bizarre avec les énums de csharp , bien sur je peux utiliser des dictionnaires mais un énum de n'importe que type aurait pu être pas mal.
Associer une chaîne de caractères à une valeur d'enum présente clairement un intérêt.
Je prends un exemple de l'article :
Dans le morceau de code suivant, le développeur est obligé d'énumérer toutes les valeurs d'enum pour y associer un message :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public enum ConnectionResult { ConnectionOK, WrongLogin, WrongPassword }
Or, il serait beaucoup plus simple de faire la même chose en une ligne :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ConnectionResult connectionResult = UserCanConnect("foo", "bar"); if (connectionResult == ConnectionResult.ConnectionOK) Console.WriteLine("Connexion réussie !"); else if (connectionResult == ConnectionResult.WrongLogin) Console.WriteLine("Connexion refusée : login inconnu."); else if (connectionResult == ConnectionResult.WrongPassword) Console.WriteLine("Connexion refusée : mot de passe erroné.");
Mais la méthode ToString() ne renvoie que le nom de l'enum (à savoir "ConnectionOK", "WrongLogin" ou "WrongPassword"), ce qui n'est pas très explicite pour un utilisateur final.
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part Console.WriteLine(connectionResult.ToString());
Il faut donc en passer par là et selon moi, c'est clairement un manque de C#, car en Java, il est possible d'ajouter des méthodes dans des énumérations.
Pour ce qui est de l'affichage de message cela va plus loin. Si l'application doit être localisée il y a une "couche" en plus et pour moi ce n'est pas le but d'une énumération que de gérer cette partie. Surtout que toutes n'auront pas vocation à être affichées.Envoyé par Skalp
Une énumération c'est juste une constante nommée, ni plus ni moins. A la limite le type de base d'une enum aurait toujours été Int32 que cela ne changerait pas grand chose (sauf si de grands fous ont eu besoin d'une enum en Int64 avec gestion de champs de bits ).
Après pour l'association d'un texte à une valeur d'énumération cela doit être géré autrement, avec par exemple des attributs sur les valeurs de l'énumération qui permettront d'associer un texte (soit en dur soit en attaquant un fichier de ressource si on gère la localisation).
Pas de questions techniques par MP
Je suis entièrement d'accord, cet intérêt n'est même pas discutable. Qui n'a jamais eu besoin un jour de convertir une valeur d'énumération en texte pour l'affichage dans une ComboBox ^^
En WPF je passe par des attributs, un Converter et un peu de réflexion pour gérer la conversion d'une valeur d'énumération en texte, avec gestion de contexte si jamais je peux avoir un affichage différent suivant les cas.
Pas de questions techniques par MP
Retrouvez moi sur :
Mon Espace Developpez.com------------------------------- Dvp.NET, une librairie open-source de composants .NET
Mon blog: Up there in the code---------------------------- Twitter: NatMarchand
Ma société: So@t
Showrizo : Suivez votre planning de séries télé sous Windows 8
On peut utiliser DescriptionAttribute pour associer une chaine à une valeur d'enum :
Ensuite on peut récupérer la valeur de l'attribut avec une méthode d'extension de ce genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public enum ConnectionResult { [Description("Connection réussie")] ConnectionOK, [Description("Login incorrect")] WrongLogin, [Description("Password incorrect")] WrongPassword }
Evidemment ça ne gère pas la localisation... En pratique j'utilise des ressources .resx : une ressource chaine pour chaque valeur d'enum, avec un nom prévisible ("NomDuTypeEnum_NomValeur").
Code : 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 public static string GetDescription(this Enum value) { Type type = value.GetType(); string name = Enum.GetName(type, value); if (name != null) { FieldInfo field = type.GetField(name); if (field != null) { DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attr != null) { return attr.Description; } } } return null; }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
J'avais déjà signalé ça ya un mois
De plus, comme marqué dans l'article, on a Enum.Parse... Et donc manipuler des String et derrière récupérer la valeur d'un enum...
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager