값의 열거 형 문자열 이름


407

다음과 같은 열거 형 구조가 있습니다.

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

내 데이터베이스에서 열거 형은 값으로 참조됩니다. 내 질문은 열거 형의 숫자 ​​표현을 문자열 이름으로 되돌릴 수있는 방법입니다.

예를 들어 2결과는이어야합니다 Visible.


25
VS 2015로이 작업을 수행하는 더 쉬운 방법이 있다고 생각합니다. nameof(EnumDisplayStatus.Visible)누군가에게 도움이되기를 바랍니다.
Gabriel Marius Popescu

답변:


542

int간단한 캐스트를 사용 하여 백을 열거 형 멤버로 다시 변환 한 다음 다음을 호출 할 수 있습니다 ToString().

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

13
업데이트 : IFormatProvider를 사용하는 특정 오버로드 만 더 이상 사용되지 않습니다. ToString ()은 괜찮습니다. 참조 groups.google.com/group/DotNetDevelopment/browse_thread/thread/...
AndyM

의 경우 동작은 무엇입니까 enum Foo { A = 1, B= 1 }?
dbkk

3
@dbkk 문서에는 열거 형과 관련하여 "코드가 반환되는 문자열에 대한 가정을해서는 안됩니다." 당신이 인용 한 정확한 상황 때문에. msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D' Ambra

4
업데이트 된 솔루션 : msdn.microsoft.com/en-us/library/…
Jack

4
더 짧은 : var stringValue = (((EnumDisplayStatus) value) .ToString ()
redwards510

188

인스턴스를 "Visible"얻지 않고 문자열 을 가져와야 할 EnumDisplayStatus경우 다음을 수행 할 수 있습니다.

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

5
Mandoleen의 답변에 대해 부정확 한 점이 있습니다. Enum.GetName은 Enum이 아닌 문자열을 반환합니다.
algreat

이것은 리플렉션을 사용합니까 아니면 컴파일러가 뒤에서 사용할 도우미 사전을 생성합니까?
palswim

155

이 시도:

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

@ nilco이 답변은 좋지만 주로 Kents의 답변을 선호합니다. 주로 열거 형 "Description"에 사용자 정의 속성이 있기 때문에 설명을 얻을 수있는 열거 형 확장명이 있습니다. 이는 사용자를 위해 화면에 표시하기위한 것입니다.
Harag

60

이것을 사용하십시오 :

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6 이상이 필요합니다.
Adam K Dean

10
@AZChad 그것은 확실히 아는 것이 좋습니다. 그러나 그것은하지 않습니다 정말 값이 데이터베이스에서 오는 있기 때문에, 영업의 시나리오에 적용 (그래서 : 런타임이 아닌 컴파일 시간, 값)
마크 Gravell

22

당신은 그것을 캐스팅 할 수 있습니다

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

아 .. 켄트는 나를 이길 :)


이제 Kent는 모든 "첫 번째 답변"담당자를받습니다. 좋은 켄트! : p
Matt Kocaj

12

DB에서 C #으로

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

C #에서 DB로

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

12

해결책:

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

또한 GetName을 사용하는 것이 명시 적 Enum 캐스팅 보다 낫습니다. .

[성능 벤치 마크 코드]

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

[샘플 결과]

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
이것은 7 년 된 답변의 사본입니다. 왜 당신의 것이 원래보다 더 나은지 설명 할 수 있습니까?
nvoigt

@nvoigt 내가 정확하다면 Enum의 ToString () API는 이제 폐기되었습니다. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

그래서 ... 적어도 두 개의 다른 답변이 이미 게시 한 코드를 제공합니다. 당신은 Mandoleen 또는 algreat에서 무엇을 제공합니까?
nvoigt

@nvoigt 명시 적 캐스팅과 비교하여 성능에 대해서는 언급하지 않았습니다. 내 대답을 좋아하기에 충분합니까? : p 어쨌든 고마워, 누군가에게 도움이되기를 바랍니다. :)
Naveen Kumar V

의사 소통에 문제가있는 것 같습니다. 모바일 기기를 사용하고 있습니까? 아니면 아래로 스크롤하지 않았습니까? 7 년 전부터 두 가지 정확한 답변 사본이 있습니다. 나는 답변자들의 이름을 정 했으므로 쉽게 찾을 수 있어야한다. 적어도 7 년 동안 여기에 있지 않은 답은 무엇입니까?
nvoigt

9

nameof expression 을 사용하는 가장 빠른 컴파일 시간 솔루션 입니다.

열거 형의 리터럴을 반환합니다.

public enum MyEnum {
    CSV,
    Excel
}


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

노트 :

  • 열거 형 이름을 대문자로 사용하고 싶지는 않지만의 대소 문자 구분을 설명하는 데 사용됩니다 nameof.

이것은 답이되어야합니다.
LinPy 팬

@ LinPyfan 다행 그것은 잘 작동합니다! 이것은 영업일에 비해 상대적으로 새로운 것입니다.
수확

4

그냥 필요하다:

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

1
대부분의 경우 이것은 10 년 전의 최고 답변과 거의 동일합니다. "f"지정자 의 추가 는 미묘한 것이며 호출자가 원하는 것이거나 아닐 수도 있습니다 (필요에 따라 다름) : docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell

나는 날짜 아하에주의를 기울이지 않았다. 나는이 같은 오래된 솔루션을 약간 업데이트하는 것이 좋다고 생각합니다. 이 페이지를 마지막으로 열지 않습니다. 정확성에 감사드립니다! :)
Al3x_M 16:29

3

문자열 값 [Name]을 가져 오는 경우 :

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

그리고 열거 형 값을 얻으려면 :

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

왜 .ToString ()이 아닌가? '마른 세수'
MeTitus

3

아래에 주어진이 코드를 사용했습니다

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

1

int를 열거 형으로 캐스팅하십시오.

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.