Ответ 1
EDIT: Обратите внимание, что в течение этого ответа я переименовал Animals
в Animal
. Согласно соглашениям .NET, только перечисления на основе флагов должны иметь множественное имя.
Вы можете использовать Enum.GetValues()
:
foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) {
Console.WriteLine(type.toString());
}
Как отмечено в комментарии Дэн, если вы используете явный ввод в вашем цикле foreach
, вам не нужно выделять:
foreach (Animal type in Enum.GetValues(typeof(Animal)) {
Console.WriteLine(type.toString());
}
Но теперь вы не обнаружите ошибок как можно раньше. Например:
foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) {
Console.WriteLine(type.toString());
}
Где SomeEmptyEnum
(очевидно) пустой тип перечисления. Здесь GetValues
возвращает пустой массив типа SomeEmptyEnum[]
. В приведенном выше коде будет только проверяться, что каждый член возвращаемого массива имеет правильный тип, поэтому вы не заметите проблему. Очевидно, что это вряд ли произойдет в реальной жизни, но это демонстрирует запах кода, который заставляет меня отличать результат - в основном я предпочитаю иметь дело с сильно типизированными коллекциями.
В качестве альтернативы, для несколько более типичного подхода вы можете использовать мою библиотеку Unconstrained Melody:
foreach (var type in Enums.GetValues<Animal>()) {
Console.WriteLine(type.ToString());
}
Здесь my Enums.GetValues<T>()
возвращает IList<T>
, что означает:
- Не нужно бросать
- Он фактически возвращает неизменный список, поэтому ему не нужно создавать новую коллекцию каждый раз, в отличие от стандартного
Enum.GetValues()
Он также получил общее ограничение, заставляющее T
быть типом перечисления, поэтому вы не можете случайно вызвать его с типом non-enum, в отличие от Enum.GetValues()
...