2014-11-23 2 views
3

Я нашел этот ответ на StackOverflow перечислить перечисление определенного типа:Как перечислять перечисления, когда тип перечисления известен только во время выполнения?

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

Это отлично работает, если я жестко закодировать тип перечисления. Но мне нужно установить тип во время выполнения. я попытался следующие, но это не работает:

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

Вы имеете в виду вы должны установить его во время выполнения? –

+1

Как вы понимаете: не работает? Не компилирует ли он или не показывает вам ошибку во время выполнения (и какая ошибка)? – Sjips

+0

«Я нашел этот ответ на stackoverflow» - ради того, чтобы дать кредит, всегда целесообразно преобразовать этот текст в * ссылку * в ответ, который вы упомянули. –

ответ

0

Ваш T уже типа Type. Нет необходимости использовать другой typeof. Простой бросок к T[] должно хватить:

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

typeof(T) обычно возвращает вам Type объект, поэтому компилятор считает, что вы хотите применить индексацию к этому объекту.

Попробуйте использовать:

Enum.GetValues(typeof(T)).Cast<T>()

1
public static IEnumerable<T> GetValues<T>() 
{ 
    return Enum.GetValues(typeof(T)).Cast<T>(); 
} 

См fiddle

1

Вы можете использовать метод Cast<T>() для результата custing и метод 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 
} 
Смежные вопросы