Enum String Name from Value


407

J'ai une construction enum comme celle-ci:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

Dans ma base de données, les énumérations sont référencées par valeur. Ma question est, comment puis-je retourner la représentation numérique de l'énumération au nom de la chaîne.

Par exemple, étant donné 2le résultat devrait être Visible.


25
Je crois que maintenant il existe un moyen plus facile de le faire avec VS 2015 nameof(EnumDisplayStatus.Visible)Espérons que cela aide quelqu'un
Gabriel Marius Popescu

Réponses:


542

Vous pouvez convertir le intdos en membre d'énumération avec un cast simple, puis appeler ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
Mise à jour: seules certaines surcharges utilisant IFormatProvider sont obsolètes. ToString () est très bien. Voir groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM

Quel est le comportement en cas de enum Foo { A = 1, B= 1 }?
dbkk

3
@dbkk, la documentation indique qu'en ce qui concerne les énumérations, "votre code ne doit pas faire d'hypothèses sur la chaîne qui sera renvoyée." en raison de la situation précise que vous citez. voir msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra

4
Une solution actualisée
Jack

4
short: var stringValue = ((EnumDisplayStatus) value) .ToString ()
redwards510

188

Si vous avez besoin d'obtenir une chaîne "Visible"sans obtenir d' EnumDisplayStatusinstance, vous pouvez le faire:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

5
Si vous au sujet de la réponse de Mandoleen il y a une inexactitude: Enum.GetName renvoie une chaîne, pas un Enum
algreat

Est-ce que cela utilise la réflexion ou le compilateur crée-t-il un dictionnaire d'aide à utiliser en arrière-plan?
palswim

155

Essaye ça:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco cette réponse est bonne, mais je préfère la réponse de Kents, principalement parce que j'ai un attribut personnalisé sur mes énumérations "Description" J'ai ensuite une extension enum pour obtenir la description - c'est pour l'affichage à l'écran pour l'utilisateur.
Harag

60

Utilisez ceci:

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6+ requis cependant.
Adam K Dean

10
@AZChad c'est une grande chose à savoir, bien sûr; mais cela ne s'applique pas vraiment dans le scénario de l'OP, puisque les valeurs proviennent d'une base de données (donc: runtime, pas au moment de la compilation, valeurs)
Marc Gravell

22

vous pouvez simplement le lancer

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ah .. kent m'a battu :)


Maintenant, Kent obtient tout le représentant de «première réponse». Joli Kent! : p
Matt Kocaj

12

DB à C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C # à DB

string dbStatus = ((int)status).ToString();

12

SOLUTION:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

En outre, l'utilisation de GetName est meilleure que la conversion explicite d'Enum .

[Code de référence de performance]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Exemple de résultat]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

2
Ceci est une copie d'une réponse vieille de 7 ans. Pouvez-vous expliquer pourquoi le vôtre est meilleur que l'original?
nvoigt

@nvoigt Parce que, si j'ai raison, l'API ToString () sur Enum est désormais obsolète. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

Donc ... au moins deux autres réponses fournissent déjà le code que vous avez publié. Que propose le vôtre par rapport à celui de Mandoleen ou d'algreat?
nvoigt

@nvoigt Ils n'ont pas mentionné ses performances par rapport au casting explicite. Est-ce suffisant pour que vous aimiez ma réponse? : p Merci quand même, j'espère que ça va aider quelqu'un. :)
Naveen Kumar V

Nous semblons avoir un problème de communication. Êtes-vous sur un appareil mobile ou n'avez-vous pas fait défiler assez loin? Il y a deux copies exactes de votre réponse datant de 7 ans. J'ai nommé les répondeurs, donc ils devraient être faciles à trouver. Que répond votre réponse qui n'existe pas depuis au moins 7 ans déjà?
nvoigt

9

La solution de compilation la plus rapide utilisant nameof expression .

Renvoie le littéral de l'énumération.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Remarque:

  • Vous ne voudriez pas nommer une énumération en majuscules, mais utilisée pour démontrer la sensibilité à la casse de nameof.

Cela aurait dû être une réponse.
Fan de LinPy

@LinPyfan Heureux que cela fonctionne bien! Ceci est relativement nouveau par rapport à la date OP.
Reap

4

Juste besoin:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
dans la plupart des cas, c'est à peu près identique à la réponse la plus haute d'il y a 10 ans; l'ajout du "f"spécificateur est nuancé, et peut être ou non ce que veut l'appelant (cela dépend de: ce qu'il veut): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell

Je n'ai pas fait attention à la date ahah. Je pense qu'il est bon de mettre à jour un peu l'ancienne solution comme celle-ci. Je ne serai pas le dernier à ouvrir cette page. Et merci pour votre précision! :)
Al3x_M

3

Pour obtenir la valeur de chaîne [nom]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

Et pour obtenir la valeur enum:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

Pourquoi pas juste .ToString ()? 'facepalm'
MeTitus

3

j'ai utilisé ce code ci-dessous

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

Il suffit de convertir l'int entier en type d'énumération:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.