[C#] 열거형 값을 문자열로 사용해보자

2022. 12. 30. 13:02C#

Description

 

* 왜 필요함?

코드를 작성하다보면 열거형을 문자열처럼 사용하고 싶을 때가 있다.

예를들어 아래와 같은 열거형이 있다고 보자

public enum PLang
{
    C,
    Cpp,
    CSharp,
    Go,
    Rust,
    AJ,
}

그리고 이제 아래처럼 출력을 해보면

Console.WriteLine(PLang.Cpp);
Console.WriteLine(PLang.CSharp);

 

문자열로 잘 나온다. 

그럼 끝일까? 생각해보면 열거형 목록명은 특수문자나 띄워쓰기 같은게 불가하다.

예를 들어 C++, C# 이런 형태로 쓰는게 불가하다는 뜻

구문분석 오류

 

그런데 열거형으로 C++, C# 같은 특수문자가 나오게 하거나 띄워쓰기가 되게 하고 싶다 하면 구현 방법도, 사용방법도 상당히 불편해진다. 불편해지는만큼 코드 유지보수비용도 증가하는건 덤

그래서 위와 같은 기능을 간략하게 사용할 수 있는 방법이 있으면 좋겠다는게 Description의 필요성


 

* 그래서 어찌 해결함?

그럼 이제 어째야 되나?

Description에 대한 내용이니까 당연히 Description으로 해결할 것은 눈치챘을테고... 바로 해결 방법으로 들어가도록 하자

그냥 간단히 열거형 코드를 아래처럼 바꾸면 된다.

using System.ComponentModel;

public enum PLang
{
    [Description ("C")] C,
    [Description ("C++")] Cpp,
    [Description ("C#")] CSharp,
    [Description ("Go")] Go,
    [Description ("Rust")] Rust,
    [Description ("AJ")] AJ,
}

그리고 이제 아래처럼 열거형 값을 Description attribute를 통해 문자열로 변환해주는 코드를 하나 작성하자

using System.Reflection;

public static class EnumHelper
{
    public static string ToDescription(Enum value)
    {
        // Get the Description attribute value for the enum value
        FieldInfo fi = value.GetType().GetField(value.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
    }
}

이제 아래처럼 사용하면 Description 에 지정된 문자열 이 출력된다.

Console.WriteLine(EnumHelper.ToDescription(PLang.Cpp));
Console.WriteLine(EnumHelper.ToDescription(PLang.CSharp));


 

* 조금 더

뭐 괜찮긴한데 솔직히 함수를 일일이 호출해서 사용해야하니 사용하기 불편하다. 나중에 함수이름 까먹을수도 있고

까먹게되면 찾아봐야 하고 그거 전부 다 시간, 비용 낭비이고 결과적으로 유지보수비용을 높이는 원인이 된다.

그래서 이러한 경우 아래와 같이 확장메소드 를 통해 조금 더 사용하기 편하게 만들 수 있다.

아주 간단하다 위에서 만들어준 ToDescription 메소드의 Enum 파라메터에 this 키워드만 붙여주면 된다.

 

위처럼 만들고 열거형 적고 . 하면 아래처럼 인텔리센스께서 알아서 리스트를 출력해주시니 함수이름 외울 필요도 없고  개발 생산성을 높이고 유지보수비용을 낮출 수 있다.