我在stackoverflow上找到了这个答案来枚举某种类型的枚举:
var values = (SomeType[])Enum.GetValues(typeof(SomeType));
如果我对枚举类型进行硬编码,这非常有效。但我需要能够在运行时设置类型。我尝试了以下但是这不起作用:
var values = (typeof(T)[])Enum.GetValues(typeof(T));
答案 0 :(得分:1)
typeof(T)
通常会返回一个Type
对象,因此编译器认为您要将索引应用于该对象。
尝试使用:
Enum.GetValues(typeof(T)).Cast<T>()
答案 1 :(得分:1)
public static IEnumerable<T> GetValues<T>()
{
return Enum.GetValues(typeof(T)).Cast<T>();
}
请参阅fiddle
答案 2 :(得分:1)
您可以使用Cast<T>()
方法进行结果保留,使用typeof(T).IsEnum
方法进行类型检查(T
必须是枚举类型。)
目标方法:
public static IEnumerable<T> GetValues<T>()
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetValues(typeof(T)).Cast<T>();
}
用法示例:
public enum EnumFoo
{
Foo1, Foo2
}
public enum EnumBar
{
Bar1, Bar2
}
public void Main()
{
foreach (var value in GetValues<EnumFoo>())
Console.WriteLine(value); // Foo1 Foo2
foreach (var value in GetValues<EnumBar>())
Console.WriteLine(value); // Bar1 Bar2
}
答案 3 :(得分:0)
您的T
已经是Type
类型。无需使用其他typeof
。对T[]
的简单转换就足够了:
T[] values = (T[]) Enum.GetValues(typeof(T));