2011-09-30 14 views
11

digamos que tenemos una estructuraiteración a través de miembros de la estructura

Struct myStruct 
{ 
    int var1; 
    int var2; 
    string var3; 
    . 
    . 
} 

¿Es posible iterar a través de los miembros de la estructura por tal vez usando foreach? He leído algunas cosas sobre la reflexión, pero no estoy seguro de cómo aplicar eso aquí.

Hay alrededor de 20 variables en la estructura. Estoy intentando leer los valores de un archivo e intentar asignarlos a las variables pero no quiero que llame al archivo.ReadLine() 20 veces. Estoy tratando de acceder las variables del miembro a través de un bucle de

+2

@ kr13: Casi * ciertamente * no debería tener una estructura con 20 campos. Consulte http://msdn.microsoft.com/en-us/library/ms229017.aspx –

+0

Convierta su estructura en una matriz o lista, y/o utilice una biblioteca de serialización. –

+0

posible duplicado de [Iterar a través de una estructura?] (Http://stackoverflow.com/questions/661834/iterate-through-a-struct) – user7116

Respuesta

27

Se aplican reflejo en más o menos la misma forma que lo normal, usando Type.GetFields:

MyStruct structValue = new MyStruct(...); 

foreach (var field in typeof(MyStruct).GetFields(BindingFlags.Instance | 
               BindingFlags.NonPublic | 
               BindingFlags.Public)) 
{ 
    Console.WriteLine("{0} = {1}", field.Name, field.GetValue(structValue)); 
} 

Tenga en cuenta que si el struct expone propiedades (como se casi seguro que debería) puede usar Type.GetProperties para obtener esos.

(Como se señaló en los comentarios, esto puede no ser una buena cosa que hacer en primer lugar, y en general soy sospechoso de estructuras definidas por el usuario, pero yo pensé que iba a incluir la respuesta real de todos modos ...)

EDIT: Ahora parece que le interesa establecer los campos, eso es un poco más complicada debido a la forma en que funcionan los tipos de valor (y sí, esto realmente no debería ser una estructura .) Desea marcar una vez, establecer valores en la única instancia en caja, y luego unbox al final:

object boxed = new MyStruct(); 

// Call FieldInfo.SetValue(boxed, newValue) etc 

MyStruct unboxed = (MyStruct) boxed; 
+0

¡Gracias por tu respuesta! Pero parece que podría estar haciendo cosas innecesariamente complicadas. Veré si puedo lograr lo mismo usando listas. – kr13

+0

"Tenga en cuenta que si la estructura expone propiedades (como seguramente debería) debería usar Type.GetProperties para obtenerlas."? ¿Puedo preguntar por qué una estructura debe exponer propiedades? ¿Por qué no variables simples? – Naresh

+0

@Naresh: Porque los campos deben ser una preocupación de almacenamiento, en lugar de ser parte de la API pública, al menos en casi todos los casos. (Hay excepciones). Vea http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx –

Cuestiones relacionadas