2010-04-13 15 views
22

Estoy tratando de iterar sobre una enumeración, y llamo a un método usando cada uno de sus valores como parámetro. Tiene que haber una mejor manera de hacerlo que lo que tengo ahora:Iterar sobre 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) { /* ... */ } 

Obtención de los nombres de enumeración como cadenas, a continuación, analizar de nuevo a las enumeraciones, se siente horrible.

+0

posible duplicado de [C# iteración a través de una enumeración? (Indexar un System.Array)] (http://stackoverflow.com/questions/482729/c-sharp-iterating-through-an-enum-indexing-a-system-array) –

Respuesta

31

Bueno, se puede utilizar Enum.GetValues:

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

No es fuertemente tipado sin embargo - y IIRC es bastante lento. Una alternativa es utilizar mi UnconstrainedMelody project:

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

UnconstrainedMelody es bueno si usted está haciendo un montón de trabajo con enumeraciones, pero podría ser excesiva para un solo uso ...

+0

Tampoco puede ser flojo y usar GameObjectType en el segundo ejemplo en lugar de var :) –

+1

@Charles: estaba haciendo eso para demostrar que realmente estaba fuertemente tipado ... en la primera versión que terminaría siendo 'objeto'. –

+2

Está bien, supongo que lo dejaré pasar esta vez. Demasiados ejemplos de C# hoy en día que usan perezamente var para todo. –

2

Sólo en caso de que alguien otra cosa es lo suficientemente loco como para querer hacer quiere hacer esto en C++/CLI, aquí hay un puerto que funciona:

using namespace System; 

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

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