2022. 12. 30. 13:02ㆍC#
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 키워드만 붙여주면 된다.
위처럼 만들고 열거형 적고 . 하면 아래처럼 인텔리센스께서 알아서 리스트를 출력해주시니 함수이름 외울 필요도 없고 개발 생산성을 높이고 유지보수비용을 낮출 수 있다.
'C#' 카테고리의 다른 글
[C#] is 패턴 매칭, is not 패턴 매칭 에 대해 알아보자 (0) | 2023.11.18 |
---|---|
[C#] 비동기 프로그래밍: Task.Run과 바로 호출의 차이점 (3) | 2023.10.24 |
[C#] 비동기 프로그래밍(APM)에 대해 알아보자 (0) | 2023.03.21 |
[C#] 디버깅 시 데이터의 조사식 포맷을 변경해보자 (0) | 2022.12.30 |
[C#] 외부함수를 멤버함수처럼 사용하기 (0) | 2022.12.26 |