Program Tip

Enum.GetValues ​​() 반환 유형

programtip 2020. 12. 14. 20:46
반응형

Enum.GetValues ​​() 반환 유형


나는 '열거 형의 유형이 주어지면 System.Enum의 GetValues ​​() 메서드는 주어진 열거 형의 기본 유형의 배열을 반환합니다', 즉 int, byte 등이라는 문서를 읽었습니다.

그러나 나는 GetValues ​​메서드를 사용하고 있으며 계속해서 돌아 오는 것은 Enums 유형의 배열입니다. 내가 뭔가를 놓치고 있습니까 ??


public enum Response
{
    Yes = 1,
    No = 2,
    Maybe = 3
} 

foreach (var value in Enum.GetValues(typeof(Response))) { var type = value.GetType(); // type is always of type Enum not of the enum base type }

감사


결과를 원하는 실제 배열 유형으로 캐스팅해야합니다.

(Response[])Enum.GetValues(typeof(Response))

GetValues는 강력한 형식이 아니므로

편집 : 답을 다시 읽으십시오. GetValues는 기본 형식이 아닌 실제 열거 형 형식의 배열을 반환하므로 각 열거 형 값을 기본 형식으로 명시 적으로 캐스팅해야합니다. Enum.GetUnderlyingType이 도움이 될 수 있습니다.


NET 3.5를 사용하는 경우 (예 : LINQ가있는 경우) 다음을 수행 할 수 있습니다.

var responses = Enum.GetValues(typeof(Response)).Cast<Response>();

개인적으로 Utils 프로젝트에서 별도의 메서드를 만들었으며 다른 프로젝트에 포함 시켰습니다. 내가 사용하는 코드는 다음과 같습니다.

public static class EnumUtil
{
    public static IEnumerable<TEnum> GetAllValues<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
    }   
}

그리고 나는 이것을 다음과 같이 부릅니다.

var enumValues = EnumUtil.GetAllValues<Response>();

언급 한 문서를 참조 해 주시겠습니까? MSDN 문서Enum.GetValues 에는 이와 같은 내용이 언급 되어 있지 않습니다 (해당 페이지의 인용문).

반환 값

유형 : System.Array

enumType에있는 상수 값의 배열입니다. 배열의 요소는 열거 형 상수의 이진 값으로 정렬됩니다.


으로 로저 코멘트에 언급이 있다면, 그것은 좋은 것입니다 Enum.GetValues<MyEnum>()일반적인 구현 만이 아니다.

이 문제는 나를 짜증나게했기 때문에 C ++ / CLI로 클래스 에있는 모든 정적 메서드의 일반 구현 과 열거 형 작업을위한 다른 일반 메서드를 포함 하는 라이브러리만들었습니다 Enum.

The library is written in C++/CLI because C# does not support constraining a generic type by System.Enum. C++/CLI (and the CLR) do support constraining by System.Enum and C#/VB.NET has no problem understanding calls to a method that have this constraint.

In the case of your example, you'd use Enums.GetValues<MyEnumType>() which will hand you an array of MyEnumType without the need to cast. Though C# and VB.Net do not support defining an enum constraint, they have no problem with consuming a method/class that has such a constraint and intellisense/the compiler handle it perfectly.


Similar to Joel's Answer but done a slight different way:

public static class Enums<T>
  where T : struct, IComparable, IFormattable, IConvertible
{
  static Enums()
  {
    if (!typeof(T).IsEnum)
      throw new ArgumentException("Type T must be an Enum type");  
  }

  public static IEnumerable<T> GetValues()
  {
    var result = ((T[])Enum.GetValues(typeof(T)).ToList()

    return result;
  }
}

Usage:

IEnumerable<System.Drawing.FontStyle> styles = Enums<System.Drawing.FontStyle>.GetValues();

참고URL : https://stackoverflow.com/questions/1398664/enum-getvalues-return-type

반응형