如果只在运行时知道枚举类型,如何枚举枚举?

时间:2014-11-23 15:53:45

标签: c# enums

我在stackoverflow上找到了这个答案来枚举某种类型的枚举:

var values = (SomeType[])Enum.GetValues(typeof(SomeType));

如果我对枚举类型进行硬编码,这非常有效。但我需要能够在运行时设置类型。我尝试了以下但是这不起作用:

var values = (typeof(T)[])Enum.GetValues(typeof(T));

4 个答案:

答案 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));