예를 들어 ‘ 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
}
}