가능한 중복 :
누구나 열거 형 제네릭 제약의 부족에 대한 좋은 해결 방법을 알고 있습니까?
T를 Enum으로 제한하는 일반 메소드 생성
제네릭 형식 매개 변수를 제한 할 수 있습니까? [올바른 이름인지는 모릅니다.]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());
}
최신 정보
나는 결국 Jon Skeet을 사용했다.제한되지 않은 멜로디그 목적을 위해. 귀하의 모든 공헌에 감사드립니다.
불행히도, 당신은 할 수 없습니다 -Microsoft는 항목을 수정하지 않으므로이 항목을 종료했습니다..
열거 형을 구조체로 취급하고이를 제약 조건으로 사용할 수 있습니다 (Jon Skeet이 어떻게했는지 생각합니다.)제한되지 않은 멜로디?)하지만 그건보기 흉한 것입니다.
당신은 할 수 없습니다. 대체 솔루션으로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());
}
Enum.GetValues
~을 돌려 준다.Array
(그 요소는 단지 객체들입니다), 암묵적으로IEnumerable<T>
. - KeithS
Matt 's와 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의 답변에서 변경된 사항 :
return Enum.GetValues(typeof(T)).Cast<T>()
- Metro Smurf
이 방법으로 일반적인 방법을 만들 필요가 없습니다.
당신은 단지System.Enum
반환 유형에 type 매개 변수로 :
using System.Linq;
.
.
.
public IEnumerable<Enum> GetValues(Enum value)
{
return Enum.GetValues(value.GetType()).OfType<Enum>();
}
Array
제네릭은 아닙니다). - Matt Ellen