문제

모든 시스템을 변환하기위한 일반적인 방법을 만들고 싶습니다. Eenum 파생 유형을 해당 정수 값으로 캐스팅하지 않고 바람직하게는 문자열을 구문 분석하지 않고도합니다.

예를 들어, 내가 원하는 것은 다음과 같습니다.

// Trivial example, not actually what I'm doing.
class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        (int)anEnum;
    }
}

그러나 이것은 작동하지 않는 것 같습니다. Resharper는 'System.enum'유형의 표현식을 시전 할 수 없다고보고합니다.

이제 나는이 솔루션을 생각해 냈지만 오히려 더 효율적인 것을 갖고 싶습니다.

class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        return int.Parse(anEnum.ToString("d"));
    }
}

제안이 있습니까?

도움이 되었습니까?

해결책

캐스트하고 싶지 않다면

Convert.ToInt32()

트릭을 할 수 있습니다.

직접 캐스트 ( (int)enumValue) 불가능합니다. 열거는 다른 기본 유형을 가질 수 있기 때문에 이것은 "위험한"것입니다.int, long, byte...).

더 공식적으로 : System.Enum 직접적인 상속 관계가 없습니다 Int32 (둘 다 ValueTypes), 따라서 유형 시스템 내에서 명시 적 캐스트가 정확할 수 없습니다.

다른 팁

나는 물체에 캐스팅 한 다음 int로 작동하게했다.

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return (int)((object)enumValue);
    }
}

이것은 추악하고 아마도 가장 좋은 방법이 아닙니다. 더 나은 것을 생각해 낼 수 있는지 확인하기 위해 계속 엉망이 될 것입니다 ....

편집 : 변환을 게시하려고했습니다 .Toint32 (EnumValue)도 마찬가지로 Martinstettner가 저를 이겼다는 것을 알았습니다.

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}

테스트:

int x = DayOfWeek.Friday.ToInt();
Console.WriteLine(x); // results in 5 which is int value of Friday

편집 2 : 의견에서 누군가는 이것이 C# 3.0에서만 작동한다고 말했습니다. 방금 vs2005에서 이것을 테스트했는데 다음과 같이 작동했습니다.

public static class Helpers
{
    public static int ToInt(Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}

    static void Main(string[] args)
    {
        Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday));
    }

변환 해야하는 경우 어느 기본 유형에 열거 된 int) 그런 다음 사용할 수 있습니다.

return System.Convert.ChangeType(
    enumValue,
    Enum.GetUnderlyingType(enumValue.GetType()));

왜 헬퍼 방법으로 휠을 재발 명해야합니까? 캐스트하는 것은 완벽하게 합법적입니다 enum 기본 유형에 대한 가치.

타이핑이 적고 내 의견으로는 사용하기에 더 읽을 수 있습니다 ...

int x = (int)DayOfWeek.Tuesday;

... 같은 것보다 ...

int y = Converter.ToInteger(DayOfWeek.Tuesday);
// or
int z = DayOfWeek.Tuesday.ToInteger();

내 대답에서 여기:

주어진 e 에서와 같이 :

Enum e = Question.Role;

그런 다음이 작업 :

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

마지막 두 가지는 평범한 못 생겼습니다. 두 번째는 훨씬 빠르지 만 첫 번째는 더 읽기 쉬워야합니다. 또는 확장 방법이 최고이며 두 세계 중 최고 일 수 있습니다.

public static int GetIntValue(this Enum e)
{
    return e.GetValue<int>();
}

public static T GetValue<T>(this Enum e) where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
{
    return (T)(object)e;
}

이제 전화 할 수 있습니다.

e.GetValue<int>(); //or
e.GetIntValue();

a System.Enum an int 나에게 잘 작동합니다 (또한 MSDN). 아마도 그것은 resharper 버그 일 것입니다.

열거는 바이트, sbyte, short, ushort, int, uint, long and ulong으로 제한되므로 우리는 몇 가지 가정을 할 수 있습니다.

사용 가능한 최대 컨테이너를 사용하여 변환 중에 예외를 피할 수 있습니다. 불행히도, Ulong은 음수로 폭발하고 Long.MaxValue와 Ulong.MaxValue 사이의 숫자에 대해 Long이 날아가기 때문에 사용하는 컨테이너는 명확하지 않습니다. 기본 유형에 따라 이러한 선택을 전환해야합니다.

물론 결과가 int 내부에 맞지 않을 때해야 할 일을 여전히 결정해야합니다. 캐스팅은 괜찮다고 생각하지만 여전히 gotchas가 있습니다.

  1. int (long and ulong)보다 큰 필드 공간이있는 유형을 기반으로 한 열거의 경우, 일부 열거는 동일한 값으로 평가할 수 있습니다.
  2. int.maxvalue보다 더 큰 숫자를 캐스팅하면 확인 된 지역에있는 경우 예외가 발생합니다.

내 제안은 다음과 같습니다.이 기능을 노출 할 위치를 결정하기 위해 독자에게 맡길 것입니다. 도우미 또는 연장으로.

public int ToInt(Enum e)
{
  unchecked
  {
    if (e.GetTypeCode() == TypeCode.UInt64)
      return (int)Convert.ToUInt64(e);
    else
      return (int)Convert.ToInt64(e);
  }
}

열거 형식 자체에는 정적 헬퍼 기능이 많다는 것을 잊지 마십시오. 열거의 인스턴스를 해당 정수 유형으로 변환하기 만하면 주조가 가장 효율적인 방법 일 것입니다.

나는 Enum이 특정 유형의 열거가 아니기 때문에 Resharper가 불만을 제기하고 있다고 생각합니다. 열거 자체는 Enum이 아닌 Scalar Valuetype에서 파생됩니다. 일반적인 방식으로 적응 가능한 캐스팅이 필요하다면, 이것이 당신에게 잘 맞을 수 있다고 말할 것입니다 (열거 형식 자체가 일반에도 포함되어 있습니다.

public static EnumHelpers
{
    public static T Convert<T, E>(E enumValue)
    {
        return (T)enumValue;
    }
}

그런 다음처럼 사용할 수 있습니다.

public enum StopLight: int
{
    Red = 1,
    Yellow = 2,
    Green = 3
}

// ...

int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red);

나는 내 머리 꼭대기에서 확실히 말할 수 없지만 위의 코드는 C#의 유형 추론에 의해 지원 될 수도 있으므로 다음을 허용합니다.

int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top