CHashtag

[C#] parse string to enum 대소문자 무시 (ignore case) 본문

C#

[C#] parse string to enum 대소문자 무시 (ignore case)

HyoSeong 2021. 3. 2. 23:42
반응형

안녕하세요.

 

오늘은 string을 enum으로 변환할 때, 대소문자 구분 없이 string을 enum으로 변환하는 방법에 대해 알아보도록 하겠습니다.

 

방법은 간단합니다.

 

Enum.Parse의 인자 중 세 번째 인자인 ignoreCase를 사용하면 됩니다.

(해당 인자를 사용하지 않으면 ArgumentException이 발생합니다.)

 

enum Alphabet
{
    A, B, C
}

class Program
{
    public void Main()
    {
        Alphabet alphabet1 = (Alphabet)Enum.Parse(typeof(Alphabet), "a", true);
        // alphabet1 = Alphabet.A
        
        Alphabet alphabet2 = (Alphabet)Enum.Parse(typeof(Alphabet), "a");
        // System.ArgumentException: '요청한 값 'a'을(를) 찾을 수 없습니다.'
    }
}

 

그렇다면 만약 대소문자를 무시하면 동일한 enum 값이 존재한다면 어떻게 될까요?

(C# enum은 대소문자를 구분하는것이 기본 정책입니다.)

 

결과는 "더 앞에 선언된 enum이 선택된다." 입니다.

 

이해를 돕기 위해 예제 코드를 작성해보았습니다.

 

// 소문자가 앞에있는 enum
enum Alphabet1
{
    a, A, b, B, c, C
}

// 대문자가 앞에있는 enum
enum Alphabet2
{
    A, a, B, b, C, c
}

class Program
{
    public void Main()
    {
        Alphabet1 alphabet1 = (Alphabet1)Enum.Parse(typeof(Alphabet1), "a", true);
        // alphabet1: Alphabet.a
        
        Alphabet2 alphabet2 = (Alphabet2)Enum.Parse(typeof(Alphabet2), "a", true);
        // alphabet2: Alphabet.A
    }
}

 

그 이유는 내부적으로 Enum.Parse에서 enum 순서대로 for문을 돌기 때문입니다.

(더 상세한 내용을 알고 싶으시다면 referencesource.microsoft.com/#mscorlib/system/enum.cs,25a49abd9da136dd 를 찾아보시면 됩니다. 글의 주제와 멀어져 자세한 설명은 생략하도록 하겠습니다.)

 

 

감사합니다.

 

반응형