ChatGPT解决这个技术问题 Extra ChatGPT

Enum String Name from Value

I have an enum construct like this:

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

In my database, the enumerations are referenced by value. My question is, how can I turn the number representation of the enum back to the string name.

For example, given 2 the result should be Visible.

I believe, now there is an easier way to do this with VS 2015 nameof(EnumDisplayStatus.Visible) Hope it helps somebody
@Gabriel: But! That returns the compile-time name of the variable or object passed in. So.... var x = MyEnum.Visible; nameof(x) would produce "x", not "Visible".

A
AustinWBryan

You can convert the int back to an enumeration member with a simple cast, and then call ToString():

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

Update: only certain overloads using IFormatProvider are deprecated. ToString() is fine. See groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
What is the behavior in case of enum Foo { A = 1, B= 1 }?
@dbkk the documentation states that with regards to enums "your code should not make any assumptions about which string will be returned." because of the precise situation you quote. see msdn.microsoft.com/en-us/library/16c1xs4z.aspx
An uptodated solution: msdn.microsoft.com/en-us/library/…
shorter: var stringValue = ((EnumDisplayStatus)value).ToString()
a
algreat

If you need to get a string "Visible" without getting EnumDisplayStatus instance you can do this:

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

If you about Mandoleen's answer there is an inaccuracy: Enum.GetName returns a string, not an Enum
n
nawfal

Try this:

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

@nilco this answer is good, but I prefer Kents' answer, mainly because I have a custom attribute on my enums "Description" I then have an enum extension to get the description - this is for displaying on screen for the user.
S
Sach

Use this:

string bob = nameof(EnumDisplayStatus.Visible);

C# 6+ required though.
@AZChad it is a great thing to know, sure; but it doesn't really apply in the OP's scenario, since the values are coming from a database (so: runtime, not compile-time, values)
R
Reap

The fastest, compile time solution using nameof expression.

Returns the literal type casing of the enum or in other cases, a class, struct, or any kind of variable (arg, param, local, etc).

public enum MyEnum {
    CSV,
    Excel
}


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

Note:

You wouldn't want to name an enum in full uppercase, but used to demonstrate the case-sensitivity of nameof.


This should've been an answer.
@LinPyfan Glad it works well! This is a relatively new compared to the OP date.
H
Hath

you can just cast it

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

ah.. kent beat me to it :)


N
Naveen Kumar V

SOLUTION:

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

Also, using GetName is better than Explicit casting of Enum.

[Code for Performance Benchmark]

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

[Sample result]

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

This is a copy of a 7 year old answer. Can you explain why your's is better than the original?
@nvoigt Because, if I am correct, the ToString() API on Enum is now obsolete. [docs.microsoft.com/en-us/dotnet/api/…
So... at least two other answers already provide the code you posted. What does your's provide over the one from Mandoleen or algreat?
@nvoigt They did not mention about its performance compared to Explicit casting. Is this sufficient for you to like my answer? :p Thanks anyway, I hope it will help someone. :)
We seem to have a communication problem. Are you on a mobile device or maybe did you not scroll down far enough? There are two exact copies of your answer from 7 years back. I named the answerers, so they should be easy to find. What does your answer provide that has not been here for at least 7 years already?
佚名

DB to C#

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

C# to DB

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

A
Al3x_M

Just need:

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

in most cases, this is pretty much identical to the top answer from 10 years ago; the addition of the "f" specifier is nuanced, and may or may not be what the caller wants (it depends on: what they want): docs.microsoft.com/en-us/dotnet/standard/base-types/…
I didn't pay attention to the date ahah. I think it is good to update a bit the old solution like this one. I won't be the last one to open this page. And thanks for your precision! :)
B
Biddut

i have used this code given below

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

M
Muhammad Aqib

For getting the String value [Name]:

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

And for getting the enum value:

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

Why not just .ToString()? 'facepalm'
V
Vivek Jain

Just cast the int to the enumeration type:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();

S
StackOverflowUser

Given:

enum Colors {
    Red = 1,
    Green = 2,
    Blue = 3
};

In .NET 4.7 the following

Console.WriteLine( Enum.GetName( typeof(Colors), Colors.Green ) );
Console.WriteLine( Enum.GetName( typeof(Colors), 3 ) );

will display

Green
Blue

In .NET 6 the above still works, but also:

Console.WriteLine( Enum.GetName( Colors.Green ) );
Console.WriteLine( Enum.GetName( (Colors)3 ) );

will display:

Green
Blue

B
Biddut

You can try this

string stringValue=( (MyEnum)(MyEnum.CSV)).ToString();

The cast is redundant