2010-04-13 13 views
22

Ich versuche, über eine Aufzählung zu iterieren, und rufen Sie eine Methode mit jedem seiner Werte als Parameter auf. Es muss ein besserer Weg, es zu tun, als das, was ich habe jetzt:Iterate über Enum?

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) { /* ... */ } 

Getting den Enum-Namen als Strings, dann sie zurück zu Aufzählungen Parsen, fühlt sich scheußlich.

+0

möglich Duplikat von [C# Iterieren durch eine eNUM? (Indexieren eines System.Array)] (http://stackoverflow.com/questions/482729/c-sharp-iterating-through-an-enum-indexing-a-system-array) –

Antwort

31

Nun können Sie Enum.GetValues verwenden:

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

Es ist allerdings nicht stark typisiert - und IIRC es ist ziemlich langsam. Eine Alternative ist mein verwenden UnconstrainedMelody project:

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

UnconstrainedMelody ist schön, wenn man eine Menge Arbeit mit Aufzählungen tun, aber es könnte viel des Guten für eine einmalige Nutzung sein ...

+0

Sie können auch nicht faul sein und verwenden GameObjectType im zweiten Beispiel anstelle von var :) –

+1

@Charles: Ich habe das getan, um zu zeigen, dass es wirklich stark typisiert war ... in der ersten Version, die damit endete, dass es "Objekt" war. –

+2

In Ordnung, ich nehme an, ich werde es diesmal gehen lassen. Einfach zu viele C# -Beispiele heutzutage, die var für alles lazy verwenden. –

2

Nur falls jemand sonst ist verrückt genug wollen möchte dies in C++/CLI tun, hier ist ein Port, der funktioniert:

using namespace System; 

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

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