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.

jdee
la source
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();
Kent Boogaart
la source
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);
grand
la source
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);
Mandoleen
la source
@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);
James Cooke
la source
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 :)

Hath
la source
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();

la source
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
Naveen Kumar V
la source
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.
Recueillir
la source
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"
Al3x_M
la source
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 ));
Muhammad Aqib
la source
Pourquoi pas juste .ToString ()? 'facepalm'
MeTitus
3

j'ai utilisé ce code ci-dessous

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
Biddut
la source
1

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

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
lacop
la source