Подтвердить что ты не робот

Итерации над перечислением?

Я пытаюсь выполнить итерацию по перечислению и вызывать метод, используя каждое его значение в качестве параметра. Должен быть лучший способ сделать это, чем то, что у меня есть сейчас:

foreach (string gameObjectType in Enum.GetNames(typeof(GameObjectType)))
{
     GameObjectType kind = (GameObjectType) Enum.Parse(typeof (GameObjectType), gameObjectType);
     IDictionary<string, string> gameObjectData = PersistentUtils.LoadGameObject(kind, persistentState);
}

//...

public static IDictionary<string, string> LoadGameObject(GameObjectType gameObjectType, IPersistentState persistentState) { /* ... */ }

Получение имен перечислений в виде строк, а затем их разворачивание к перечислениям, кажется отвратительным.

4b9b3361

Ответ 1

Ну, вы можете использовать Enum.GetValues:

foreach (GameObjectType type in Enum.GetValues(typeof(GameObjectType))
{
    ...
}

Он не сильно набрал - и IIRC это довольно медленно. Альтернативой является использование моего проекта UnconstrainedMelody:

// Note that type will be inferred as GameObjectType :)
foreach (var type in Enums.GetValues<GameObjectType>())
{
    ...
}

UnconstrainedMelody приятно, если вы много работаете с перечислениями, но это может быть излишним для одного использования...

Ответ 2

На всякий случай, если кто-то еще достаточно сумасшедший, чтобы хотеть делать, хочет сделать это в С++/CLI, вот порт, который работает:

using namespace System;

enum class GameObjectType
{
    num1 = 1,
    num2 = 2,
};

Array^ objectTypes = Enum::GetValues(GameObjectType::typeid);
for each( GameObjectType^ objectType in objectTypes)
{
    // Do something
}