반응형
제네릭 형식 매개 변수를 시스템으로 제한하는 방법.열거형
중복 가능성:
열거형 일반 제약 조건이 없는 것에 대한 좋은 해결책을 아는 사람?
T를 열거형으로 제한하는 일반 메서드 생성
일반 유형 매개 변수를 [올바른 이름인지 모르겠다]로 제한할 수 있습니까?Enum
?
예를 들어, 제가 어떻게 이런 일을 합니까?
//VB.NET
Function GetValues(Of T As System.Enum)(ByVal value As T) As IEnumerable(Of T)
Return [Enum].GetValues(value.GetType)
End Function
//C#
public IEnumerable<T> GetValues<T>(T value) where T : System.Enum
{
return Enum.GetValues(value.GetType());
}
갱신하다
저는 결국 그런 목적으로 존 스키트의 '무제한 멜로디'를 사용했습니다.여러분의 기여에 감사드립니다.
그럴수는 없어요.대체 솔루션은 다음을 사용합니다.struct
런타임 검사를 수행할 수 있습니다.
public IEnumerable<T> GetValues<T>(T value) where T : struct
{
if (!typeof(T).IsEnum) throw new NotSupportedException();
return (IEnumerable<T>)Enum.GetValues(value.GetType());
}
유감스럽게도, 당신은 할 수 없습니다 - Microsoft는 이 항목을 수정하지 않을 것이기 때문에 종료했습니다.
열거형을 구조체로 취급하고 대신 제약 조건으로 사용할 수 있습니다(존 스키트가 Unstrainted Melody에서 그렇게 했다고 생각합니다). 하지만 그것은 좀 보기 흉합니다.
Matt와 Danny의 대답은 둘 다 절반의 답을 가지고 있습니다.이를 통해 다음과 같은 이점을 얻을 수 있습니다.
public IEnumerable<T> GetValues<T>() where T : struct
{
if (!typeof(T).IsEnum) throw new InvalidOperationException("Generic type argument is not a System.Enum");
return Enum.GetValues(typeof(T)).OfType<T>();
}
Danny의 답변에서 변경된 내용:
- 제네릭 형식의 매개 변수를 갖는 것은 형식 추론을 허용하지만, 값이 실제로 사용되지 않기 때문에 제네릭 형식을 명시적으로 지정하는 것이 더 적절합니다(파라미터를 사용하지 않는 Linq 메소드와 같이).
- Enum.GetValues()는 객체 배열을 반환합니다. 이는 T의 IE 숫자에 암시적으로 캐스팅되지 않습니다.반환 유형을 준수하려면 결과를 캐스트하기 위한 추가 Linq 방법(기술적으로 OfType은 필터 작업이지만 이 경우 모든 것을 반환합니다)이 필요합니다.
- 선택 사항: 지원되지 않지만예외는 예외를 던질 수 있는 다른 선택만큼 좋은 선택입니다. 다른 옵션이 있습니다.예외, 잘못된 작업예외, 잘못된 캐스트 예외 등입니다.잘못된 작업을 선택했습니다.예외입니다. 열거형이 아닌 형식에서 열거형 값을 가져오려는 시도가 잘못되었습니다.이것은 의미론적인 것이고 저는 다른 사람의 논리와 논쟁하지 않을 것입니다.
이런 식으로 메소드를 일반화할 필요는 없습니다.
그냥 사용할 수 있습니다.System.Enum
반환 유형의 유형 매개 변수로 사용:
using System.Linq;
.
.
.
public IEnumerable<Enum> GetValues(Enum value)
{
return Enum.GetValues(value.GetType()).OfType<Enum>();
}
언급URL : https://stackoverflow.com/questions/5067724/how-to-limit-a-generic-type-parameter-to-system-enum
반응형
'programing' 카테고리의 다른 글
Postgre는 왜?SQL이 인덱스된 열에 대해 순차적 검색을 수행하시겠습니까? (0) | 2023.05.14 |
---|---|
왜 도커 내에서 포트 80에서 aspnet core가 시작됩니까? (0) | 2023.05.14 |
로그인 실패로 인해 SQL Server 2012를 시작할 수 없음 (0) | 2023.05.14 |
Mongoose - 한 함수 호출에서 여러 문서 제거 (0) | 2023.05.14 |
비동기식으로 주기적으로 기능을 실행하려면 어떻게 해야 합니까? (0) | 2023.05.14 |