623

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.

0

15 Answers 15

783

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();
Sign up to request clarification or add additional context in comments.

5 Comments

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
shorter: var stringValue = ((EnumDisplayStatus)value).ToString()
289

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

2 Comments

If you about Mandoleen's answer there is an inaccuracy: Enum.GetName returns a string, not an Enum
Much better than the accepted answer.
213

Try this:

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

Comments

105

Use this:

string bob = nameof(EnumDisplayStatus.Visible);

2 Comments

C# 6+ required though.
This solution doesn't work if you want to pass in a variable
56

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.

Comments

30

you can just cast it

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

ah.. kent beat me to it :)

Comments

20

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

5 Comments

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. [learn.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?
18

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

Comments

15

DB to C#

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

C# to DB

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

Comments

8

Just need:

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

2 Comments

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): learn.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! :)
6

i have used this code given below

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

Comments

5

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

1 Comment

Why not just .ToString()? 'facepalm'
4

Just cast the int to the enumeration type:

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

Comments

2

Another option (inspired by PowerShell) is to use the Type.GetEnumName() method:

int enumValue = 2;
string enumName = typeof(EnumDisplayStatus).GetEnumName(enumValue);

Testing indicates it to be marginally faster than the Enum.GetName() method (about 4% over 1e8 iterations).

Comments

1

You can try this

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

1 Comment

The cast is redundant

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.