[C#] 열거 형을 다른 유형의 열거 형으로 변환

예를 들어 ‘ Gender‘( Male =0 , Female =1) 열거 형이 있고 자체 Gender 열거 형 ( Male =0 , Female =1, Unknown =2) 이있는 서비스의 또 다른 열거 형이 있습니다.

내 질문은 열거 형에서 내 것으로 변환하기 위해 빠르고 멋진 것을 어떻게 작성할 수 있습니까?



답변

확장 방법을 사용하면 Nate가 제안한 두 가지 변환 방법을 사용할 때 매우 깔끔하게 작동합니다.

public static class TheirGenderExtensions
{
    public static MyGender ToMyGender(this TheirGender value)
    {
        // insert switch statement here
    }
}

public static class MyGenderExtensions
{
    public static TheirGender ToTheirGender(this MyGender value)
    {
        // insert switch statement here
    }
}

원하지 않는 경우 별도의 클래스를 사용할 필요가 없습니다. 내가 선호하는 것은 확장 메소드가 적용되는 클래스 / 구조 / 열거별로 그룹화되어있는 것입니다.


답변

주어지면 Enum1 value = ...이름을 의미하는 경우 :

Enum2 value2 = (Enum2) Enum.Parse(typeof(Enum2), value.ToString());

숫자 값을 의미하는 경우 일반적으로 다음과 같이 캐스트 할 수 있습니다.

Enum2 value2 = (Enum2)value;

(캐스트를 사용 Enum.IsDefined하면 유효한 값을 확인하는 데 사용할 수 있습니다. )


답변

하나를 int로 캐스팅 한 다음 다른 열거 형으로 캐스팅합니다 (값에 따라 매핑을 수행하려는 경우 고려).

Gender2 gender2 = (Gender2)((int)gender1);


답변

철저히하기 위해 일반적으로 Enum 1을 사용하고 Enum 2를 반환하는 함수와 Enum 2를 사용하여 Enum 1을 반환하는 함수 쌍을 만듭니다. 각 함수는 입력을 출력에 매핑하는 case 문으로 구성되며 기본 사례는 다음과 같은 예외를 발생시킵니다. 예상치 못한 값에 대해 불평하는 메시지.

이 특별한 경우에는 Male과 Female의 정수 값이 동일하다는 사실을 활용할 수 있지만, 나중에 열거 형이 변경되면 손상 될 수 있으므로 피하고 싶습니다.


답변

다음이있는 경우 :

enum Gender
{
    M = 0,
    F = 1,
    U = 2
}

enum Gender2
{
    Male = 0,
    Female = 1,
    Unknown = 2
}

우리는 안전하게 할 수 있습니다

var gender = Gender.M;
var gender2   = (Gender2)(int)gender;

또는

var enumOfGender2Type = (Gender2)0;

‘=’기호의 오른쪽에있는 열거 형이 왼쪽에있는 열거 형보다 더 많은 값을 갖는 경우를 다루려면 다른 사람들이 제안한대로이를 처리하기 위해 자신 만의 방법 / 사전을 작성해야합니다.


답변

다음과 같은 간단한 일반 확장 메서드를 작성할 수 있습니다.

public static T ConvertTo<T>(this object value)
    where T : struct,IConvertible
{
    var sourceType = value.GetType();
    if (!sourceType.IsEnum)
        throw new ArgumentException("Source type is not enum");
    if (!typeof(T).IsEnum)
        throw new ArgumentException("Destination type is not enum");
    return (T)Enum.Parse(typeof(T), value.ToString());
}


답변

다음과 같은 간단한 함수를 작성할 수 있습니다.

public static MyGender ConvertTo(TheirGender theirGender)
{
    switch(theirGender)
    {
        case TheirGender.Male:
            break;//return male
        case TheirGender.Female:
            break;//return female
        case TheirGender.Unknown:
            break;//return whatever
    }
}