2011-07-06 18 views
9

Tenemos una enumeración con órganos de valores aleatorios, dicen¡No se pueden recuperar los miembros enum en el orden en que se han definido!

enum MyEnum 
{ 
    enumMember1 = 100, 
    enumMember2 = 10, 
    enumMember3 = 50 
} 

nos podría iterar a través de los miembros de enumeración en el orden en que han sido definidos! Enum.GetValues y Enum.GetNames ¡ambos clasifican internamente los miembros y dan el resultado!

iteración de la matriz devuelta por Enum.GetNames o Enum.GetValues ​​y haciendo un .ToString() en cada uno de los elementos de la matriz nos da,

enumMember2, enumMember3, enumMember100. 

simplemente preguntaba si hay alguna fuera de la caja para conseguir el enfoque los miembros enum en el orden en que fueron creados? ¿La búsqueda no obtuvo mucha información? ¡Gracias!

P.S. ¡Odiaría hacer esto a través de un atributo personalizado! Y mientras lo estaba redactando, tenía una duda si el IL para enum se genera después de ordenar a los miembros de Enum, ¡y lo voy a verificar!

Respuesta

10

Puede utilizar la reflexión:

var values = typeof(MyEnum).GetFields(BindingFlags.Public | BindingFlags.Static) 
       .Select (x => Enum.Parse(typeof(MyEnum), x.Name)); 
+1

Sí, la forma en la reflexión funciona! ¡Ojalá Enum.GetNames conservara al menos el orden en el que se declaró la enumeración! ¡Gracias! – ioWint

+1

http://stackoverflow.com/questions/8067493/if-getfields-doesnt-guarantee-order-how-does-layoutkind-sequential-work Quisiera referirme a este enlace como GetFields (..) puede que no siempre regrese en el orden correcto. la publicación tiene una solución diferente – Mike

+0

'Enum.GetNames' [http://msdn.microsoft.com/en-us/library/system.enum.getnames.aspx] Observaciones del método: Los elementos de la matriz de valor de retorno están ordenados por los valores binarios de las constantes enumeradas (es decir, por su magnitud sin signo) –

Cuestiones relacionadas