20-0330 Enum형식에 문자열쓰기

최용국·2020년 3월 30일
0

관용구

목록 보기
3/9

20-0330 Enum 형식에 문자열쓰기

Enum 열거형식은 기본 정수 숫자 형식의 명명된 상수 집합에 의해 정의되는 값 형식이다. 어떤 타입을 정하거나 에러 코드를 관리하거나 할 때 많이 쓰인다. 하지만 이런 Enum은 앞서 말했다시피 기본 정수 숫자이다. 그러나 우리는 때로 기본 숫자 형식에서 벗어나 문자열을 Enum 형식에 쓰고 싶을 때가 있다. 이를 Attribute가 해소해 줄 수 있다.

우선 Enum형식의 에러코드가 있고 에러코드는 Description이라는 설명과 에러코드의 단축어를 갖고 있어 가독성이 좋은 Enum 에러코드를 작성해 본다.

class ErrorCodeAttribute

public class ErrorCodeAttribute : Attribute
{
    public ErrorCodeAttribute(char shortCode, string description)
    {
        ShortCode = shortCode;
        Description = description;
    }

    public string Description { get; set; }
    public char ShortCode { get; set; }
}

enum ErrorCodeEnum

public enum ErrorCodeEnum
{
    [ErrorCode('n', "Default 값 입니다.")]
    None = 0,
    [ErrorCode('u', "알 수 없습니다.")]
    Unknown = 1,
    [ErrorCode('c', "이미 닫혔습니다.")]
    Closed = 10,
    [ErrorCode('l', "연결을 찾을 수 없습니다.")]
    ConnectLost = 50,
}

static class ErrorCode

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

Program

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

    }
}

결과

profile
코딩합시다.

0개의 댓글