문자열 또는 정수로 열거 형 값을 얻는 방법


108

enum string 또는 enum int 값이 있으면 어떻게 enum 값을 얻을 수 있습니까? 예 : 다음과 같은 열거 형이있는 경우 :

public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

일부 문자열 변수에는 다음과 같이 "value1"값이 있습니다.

string str = "Value1" 

또는 일부 int 변수에는 2와 같은 값이 있습니다.

int a = 2;

enum의 인스턴스를 어떻게 얻을 수 있습니까? enum 인스턴스를 얻기 위해 enum과 입력 문자열 또는 int 값을 제공 할 수있는 일반 메서드를 원합니다.


답변:


210

아니요, 일반적인 방법은 원하지 않습니다. 이것은 훨씬 쉽습니다.

MyEnum myEnum = (MyEnum)myInt;

MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), myString);

나는 또한 더 빠를 것이라고 생각합니다.


이것은 실제로 이것을하는 올바른 방법입니다. IParsable 인터페이스가없는 것과 같은 이유로 유형을 구문 분석하는 일반적인 방법은 없습니다.
Johannes

1
@Johannes 그게 무슨 뜻이야? 일반적인 방법이 있으며 내 답변과 다른 사람도 참조하십시오.
Sriram Sakthivel

1
@SriramSakthivel OP가 설명하는 문제는 KendallFrey가 보여준 것처럼 해결됩니다. 일반 구문 분석을 수행 할 수 없습니다 . 여기를 참조하십시오 : informit.com/blogs/blog.aspx?uk=Why-no-IParseable-interface . 다른 솔루션은 C #의 "온보드"솔루션에 비해 이점이 없습니다. 가질 수있는 최대 값은 개체를 만들고 기본값 (T)으로 초기화하고 다음 단계에서 대표 문자열을 전달하는 ICanSetFromString <T>입니다. 이것은 OP가 제공 한 대답에 가깝지만 일반적으로 이것은 설계 문제이고 시스템 설계의 더 큰 요점을 놓 쳤기 때문에 무의미합니다.
Johannes

이 답변은 특히 int 및 string 사용의 여러 예제에서 매우 잘 작동했습니다. 감사합니다.
Termato

1
이제 작동한다고 생각합니다. 좀 더 간결합니다. Enum.Parse <MyEnum> (myString);
Phil B

32

이를 수행하는 방법은 여러 가지가 있지만 간단한 예를 원하면 가능합니다. 유형 안전성 및 유효하지 않은 구문 분석 등을 확인하기 위해 필요한 방어 코딩으로 향상되어야합니다.

    /// <summary>
    /// Extension method to return an enum value of type T for the given string.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this string value)
    {
        return (T) Enum.Parse(typeof(T), value, true);
    }

    /// <summary>
    /// Extension method to return an enum value of type T for the given int.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this int value)
    {
        var name = Enum.GetName(typeof(T), value);
        return name.ToEnum<T>();
    }

17

TryParse또는 ParseToObject메서드 를 사용하면 훨씬 간단 할 수 있습니다 .

public static class EnumHelper
{
    public static  T GetEnumValue<T>(string str) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }
        T val;
        return Enum.TryParse<T>(str, true, out val) ? val : default(T);
    }

    public static T GetEnumValue<T>(int intValue) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }

        return (T)Enum.ToObject(enumType, intValue);
    }
}

@chrfin 주석에서 언급했듯이 this, 매개 변수 유형 앞에 추가 하기 만하면 편리 할 수 있는 확장 메소드로 매우 쉽게 만들 수 있습니다.


2
이제도를 추가 this매개 변수와 메이크업에 EnumHelper... 정적 및 확장이 너무대로 사용할 수 있습니다 (내 대답을 볼 수 있지만 나머지 부분에 대한 더 나은 / 전체 코드를 가지고)
크리스토프 핑크에게

@chrfin 좋은 생각이지만, 범위에 네임 스페이스가있을 때 필요하지 않은 intellisense에서 터지기 때문에 선호하지 않습니다. 성가신 것 같아요.
Sriram Sakthivel

1
@chrfin 내 대답에 메모로 추가 된 의견에 감사드립니다.
Sriram Sakthivel

5

다음은 문자열로 열거 형 값을 가져 오는 C #의 메서드입니다.

///
/// Method to get enumeration value from string value.
///
///
///

public T GetEnumValue<T>(string str) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new Exception("T must be an Enumeration type.");
    }
    T val = ((T[])Enum.GetValues(typeof(T)))[0];
    if (!string.IsNullOrEmpty(str))
    {
        foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
        {
            if (enumValue.ToString().ToUpper().Equals(str.ToUpper()))
            {
                val = enumValue;
                break;
            }
        }
    }

    return val;
}

다음은 int로 열거 형 값을 가져 오는 C #의 메서드입니다.

///
/// Method to get enumeration value from int value.
///
///
///

public T GetEnumValue<T>(int intValue) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new Exception("T must be an Enumeration type.");
    }
    T val = ((T[])Enum.GetValues(typeof(T)))[0];

    foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
    {
        if (Convert.ToInt32(enumValue).Equals(intValue))
        {
            val = enumValue;
            break;
        }             
    }
    return val;
}

다음과 같은 열거 형이있는 경우 :

public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

그런 다음 위의 방법을 다음과 같이 사용할 수 있습니다.

TestEnum reqValue = GetEnumValue<TestEnum>("Value1");  // Output: Value1
TestEnum reqValue2 = GetEnumValue<TestEnum>(2);        // OutPut: Value2

이것이 도움이되기를 바랍니다.


4
이것을 어디서 얻었는지에 대한 참조를 제공 할 수 있습니까?
JonH

이것을 컴파일하려면 첫 번째 줄을 public T GetEnumValue <T> (int intValue)로 수정해야했습니다. 여기서 T : struct, IConvertible 또한 끝에 추가 '}'를주의하세요
Avi

3

제네릭 타입 정의를 잊었다 고 생각합니다.

public T GetEnumValue<T>(int intValue) where T : struct, IConvertible // <T> added

다음과 같이 가장 편리하게 개선 할 수 있습니다.

public static T ToEnum<T>(this string enumValue) : where T : struct, IConvertible
{
    return (T)Enum.Parse(typeof(T), enumValue);
}

그러면 다음을 수행 할 수 있습니다.

TestEnum reqValue = "Value1".ToEnum<TestEnum>();

2

이런 식으로 시도

  public static TestEnum GetMyEnum(this string title)
        {    
            EnumBookType st;
            Enum.TryParse(title, out st);
            return st;          
         }

그래서 당신은 할 수 있습니다

TestEnum en = "Value1".GetMyEnum();

2

SQL 데이터베이스에서 다음과 같이 열거 형을 가져옵니다.

SqlDataReader dr = selectCmd.ExecuteReader();
while (dr.Read()) {
   EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0));
   ....         
}

2

간단히 시도하십시오

또 다른 방법

public enum CaseOriginCode
{
    Web = 0,
    Email = 1,
    Telefoon = 2
}

public void setCaseOriginCode(string CaseOriginCode)
{
    int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}

0

다음은 문자열 / 값을 가져 오는 예입니다.

    public enum Suit
    {
        Spades = 0x10,
        Hearts = 0x11,
        Clubs = 0x12,
        Diamonds = 0x13
    }

    private void print_suit()
    {
        foreach (var _suit in Enum.GetValues(typeof(Suit)))
        {
            int suitValue = (byte)(Suit)Enum.Parse(typeof(Suit), _suit.ToString());
            MessageBox.Show(_suit.ToString() + " value is 0x" + suitValue.ToString("X2"));
        }
    }

    Result of Message Boxes
    Spade value is 0x10
    Hearts value is 0x11
    Clubs value is 0x12
    Diamonds value is 0x13

0

다음 방법을 사용하여 수행 할 수 있습니다.

public static Output GetEnumItem<Output, Input>(Input input)
    {
        //Output type checking...
        if (typeof(Output).BaseType != typeof(Enum))
            throw new Exception("Exception message...");

        //Input type checking: string type
        if (typeof(Input) == typeof(string))
            return (Output)Enum.Parse(typeof(Output), (dynamic)input);

        //Input type checking: Integer type
        if (typeof(Input) == typeof(Int16) ||
            typeof(Input) == typeof(Int32) ||
            typeof(Input) == typeof(Int64))

            return (Output)(dynamic)input;

        throw new Exception("Exception message...");
    }

참고 :이 방법은 샘플 일 뿐이며 개선 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.