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
'Program Tip' 카테고리의 다른 글
Haskell에서 빈 목록을 확인하기 위해 == [] 대신 null 함수를 사용하는 이유는 무엇입니까? (0) | 2020.12.14 |
---|---|
표시하지 않고 VBA로 읽기 위해 Excel 파일 열기 (0) | 2020.12.14 |
Python의 string.replace 대 re.sub 사용 (0) | 2020.12.14 |
Visual Studio에서 KeyDown 이벤트, KeyPress 이벤트 및 KeyUp 이벤트의 차이점 (0) | 2020.12.14 |
\ n이 포함 된 Python 스트립 (0) | 2020.12.14 |