可能重复:
Anyone know a good workaround for the lack of an enum generic constraint?
Create Generic method constraining T to an 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的Unconstrained Melody。感谢大家的贡献。
答案 0 :(得分:16)
你做不到。另一种解决方案是使用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());
}
答案 1 :(得分:7)
不幸的是,你不能 - Microsoft closed this one out as a won't fix item。
您可以将枚举视为结构并将其用作约束(我认为Jon Skeet是如何在Unconstrained Melody中执行此操作的?)但这有点不雅观。
答案 2 :(得分:5)
马特和丹尼的答案都有一半的答案。这实际上应该可以满足您的需求:
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回答的变化:
答案 3 :(得分:2)
没有必要以这种方式使您的方法通用。
您可以在返回类型中使用System.Enum
作为类型参数:
using System.Linq;
.
.
.
public IEnumerable<Enum> GetValues(Enum value)
{
return Enum.GetValues(value.GetType()).OfType<Enum>();
}