[C#] Enum & ToString() [Résolu]

Signaler
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Lorsque l'on a un enum,
on peut avoir un code :

MyEnum.MyElement.ToString ()

Oki, ca marche mais si par exemple on voulait redéfinir le résultat pour obtenir une chaîne différente (par exemple lors d'une localisation) on fait comment à part passer par une bonne grosse table de conversion ?

----------------------------
C++ forever
C# amateur

16 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

Sinon tu peux aussi utiliser la reflection en définissant un attribut Description sur les champs que tu veux , avec une petite méthode "utilitaire" qui te servira pour tout tes enums :


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;
}
}

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Une enumération sert a avoir une valeur constante par rapport a une chaine, pas l'inverse !



Donc a moins de passer par des ressources afin de mettre en oeuvre la localisation (c'est a ca que ca sert), je ne vois pas ...


Mx
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
ou sinon tu utilise une structure dans ce style la

public struct machin
{
public string truc = "une chaine";
public string bignou = "une autre chaine";
...
}

ou sinon si tu veux faire un truc plus violent, tu peux creer une structure d'objet, avec un objet comme ca :

public class MySpecialEnum
{
public readonly string Value;
public readonly int ID;

public MySpecialEnum(int id, string s)
{
Value = s;
ID = id;
}

public static bool operator==(MySpecialEnum a, MySpecialEnum b)
{
return (a.ID == b.ID);
}

public override string ToString()
{
return (Value);
}
}

et ensuite ta structure :

public struct MyEnums
{
public MySpecialEnum truc = new MySpecialEnum(1, "une chaine avec truc ecrit dedans");
public MySpecialEnum machin = new MySpecialEnum(2, "une chaine qui dit machin");
public MySpecialEnum arf = new MySpecialEnum(3, "arf arf!!");
}

et ensuite admettons que tu es une instance de ta structure MyEnums qui s'appel myen, tu peut faire

if (my_special_enum_object == myen.truc)
{
// ici c'est l'operateur == qui se charge du boulot, catte methode permet de comparer des int et non pas de faire implicitement des string.Compare(), qui sont beaucoup plus couteux
}

et si tu as besoin d'afficher :

txtAffiche.Text = myen.truc;
// en theorie ceci devrais implicitement appeler la fonction ToString() qu'on a redefini, et sinon au pire myen.truc.ToString();

voila, j'espere que ca peut t'aider un peu :)
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
ah oui j'oubliais, tu peux aussi ne pas te preoccuper des ID a la creation des objets MySpecialEnum en mettant une variable static auto-incremental au sein de la classe.

ceci dit, la methode que j'ai mis plus au te permet d'avoir un control precis sur tes ID, car tu peut vouloir quelques fois avec deux objets different avec les memes ID.
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

ca reste violent comme méthode, je me demande ou le compilo met le code
qu'il génère pour générer ses strings d'enum. enfin bref, pour le
moment, je sens que le switch va rester comme ca et au pire, je fais un
hashtable.

----------------------------
C++ forever
C# amateur
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
les chaines en dur sont stockées dans une table adressé, dans le binaire
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Ces méthodes de barbares

Mx
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
une petite question qui n'as rien a voir avec le sujet mais qui peut toutefois interesser du monde, pour avoir la coloration syntaxique, est-ce que tu fait ca a la pogne ou est-ce qu'il y a une balise particuliere qui explique a une moulinette qu'on veut qu'elle le fasse tout seul pour nous ?

ou est-ce que tu code dans VS et le copier/coller garde la couleur ? (je suis pas sur de ca)
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Je crois que c'est le copier/coller qui garde la couleur.

Mx
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Si, le c/c depuis VS se fait en RTF avec conservation des couleurs quand on colle dans la FreeTexBox :-)
J'ai juste un bout de code qui remplace les \par par des \line dans le presse papier, sinon il y a une ligne passée entre chaque ligne quand on colle dans la FTB.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
D'ailleurs ta source qui modifie le presse papier est tres utile coq ^^

Mx
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Ah cool y'en a au moins un qui s'en sert lol

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
merci pour vos reponses :)
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

y'a pas à dire, le Coq, c'est vraiment l'amis de tout le monde.

Allez, je te nomme au titre d'Ingénieur Génial Divin ;p

Vin.

non dsl c'était facile comme jeu de mot

----------------------------
C++ forever
C# amateur
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
coq au vin ?
c'etait vraiment encore plus facile ^^
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
lol
z'en avez mit du temps quand même à me la sortir celle là

Cocoricoooooooo !!!!
coq
MVP Visual C#