Enum 열거형식은 기본 정수 숫자 형식의 명명된 상수 집합에 의해 정의되는 값 형식이다. 어떤 타입을 정하거나 에러 코드를 관리하거나 할 때 많이 쓰인다. 하지만 이런 Enum은 앞서 말했다시피 기본 정수 숫자이다. 그러나 우리는 때로 기본 숫자 형식에서 벗어나 문자열을 Enum 형식에 쓰고 싶을 때가 있다. 이를 Attribute가 해소해 줄 수 있다.
우선 Enum형식의 에러코드가 있고 에러코드는 Description이라는 설명과 에러코드의 단축어를 갖고 있어 가독성이 좋은 Enum 에러코드를 작성해 본다.
public class ErrorCodeAttribute : Attribute
{
public ErrorCodeAttribute(char shortCode, string description)
{
ShortCode = shortCode;
Description = description;
}
public string Description { get; set; }
public char ShortCode { get; set; }
}
public enum ErrorCodeEnum
{
[ErrorCode('n', "Default 값 입니다.")]
None = 0,
[ErrorCode('u', "알 수 없습니다.")]
Unknown = 1,
[ErrorCode('c', "이미 닫혔습니다.")]
Closed = 10,
[ErrorCode('l', "연결을 찾을 수 없습니다.")]
ConnectLost = 50,
}
public static class ErrorCode
{
private static IEnumerable<MemberInfo> ErrorCodeMembers
{
get
{
var errorType = typeof(ErrorCodeEnum);
{
foreach (var errorMember in errorType.GetMembers())
{
yield return errorMember;
}
}
}
}
private static IEnumerable<ErrorCodeAttribute> ErrorCodeAttributes
{
get
{
foreach (var errorMember in ErrorCodeMembers)
{
if (errorMember.GetCustomAttributes(typeof(ErrorCodeAttribute), true).FirstOrDefault() is ErrorCodeAttribute errorCodeAttr)
{
yield return errorCodeAttr;
}
}
}
}
private static ErrorCodeAttribute GetErrorCodeAttribute(MemberInfo errorMember)
{
if (errorMember.GetCustomAttributes(typeof(ErrorCodeAttribute), true).FirstOrDefault() is ErrorCodeAttribute errorCodeAttr)
return errorCodeAttr;
else
return null;
}
public static string GetErrorCodeDescription(ErrorCodeEnum errorCodeEnum)
{
foreach(var errorMember in ErrorCodeMembers)
{
if (errorMember.Name == errorCodeEnum.ToString())
return GetErrorCodeAttribute(errorMember)?.Description;
}
return string.Empty;
}
public static char GetShortCode(ErrorCodeEnum errorCodeEnum)
{
foreach(var errorMember in ErrorCodeMembers)
{
if (errorMember.Name == errorCodeEnum.ToString())
{
var errorCodeAttr = GetErrorCodeAttribute(errorMember);
if (errorCodeAttr is null)
return default(char);
return errorCodeAttr.ShortCode;
}
}
return default(char);
}
public static string GetErrorCodeDescription(char shortCode)
{
foreach (var errorCodeAttribute in ErrorCodeAttributes)
{
if (errorCodeAttribute.ShortCode == shortCode)
return errorCodeAttribute.Description;
}
return string.Empty;
}
public static IEnumerable<string> GetErrorCodeDescriptions()
{
foreach(var errorCodeAttribute in ErrorCodeAttributes)
{
yield return errorCodeAttribute.Description;
}
}
public static IEnumerable<char> GetShortCodes()
{
foreach (var errorCodeAttribute in ErrorCodeAttributes)
{
yield return errorCodeAttribute.ShortCode;
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("===============Description=================");
foreach (var description in ErrorCode.GetErrorCodeDescriptions())
{
Console.WriteLine(description);
}
Console.WriteLine("====================Char===================");
foreach(var description in ErrorCode.GetShortCodes())
{
Console.WriteLine(description);
}
Console.WriteLine("=========================================");
Console.WriteLine($"Description: {ErrorCode.GetErrorCodeDescription(ErrorCodeEnum.ConnectLost)} ShortCode: {ErrorCode.GetShortCode(ErrorCodeEnum.ConnectLost)}");
Console.WriteLine("=========================================");
Console.WriteLine($"Description: {ErrorCode.GetErrorCodeDescription('c')} ShortCode: 'c'");
Console.WriteLine("=========================================");
Console.ReadLine();
}
}