2011-09-30 12 views
11

Powiedzmy mamy structiteracja członków struct

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

Czy to możliwe, aby wykonać iterację członków struktury poprzez być może przy użyciu foreach? Czytałem kilka rzeczy o refleksji, ale nie jestem pewien, jak to zastosować.

Istnieje około 20 zmiennych w strukturze. Próbuję odczytać wartości z pliku i próbuję przypisać je do zmiennych, ale nie chcę, aby wywoływać file.ReadLine() 20 razy. Próbuję uzyskać dostęp do członu zmienne przez pętlę

+2

@ kr13: Prawie * na pewno * nie powinno mieć struktury z 20 polami. Zobacz http://msdn.microsoft.com/en-us/library/ms229017.aspx –

+0

Przekształć strukturę w tablicę lub listę i/lub użyj biblioteki szeregowania. –

+0

możliwy duplikat [Iterate Through a Struct?] (Http://stackoverflow.com/questions/661834/iterate-through-a-struct) – user7116

Odpowiedz

27

zastosować odbicie w prawie taki sam sposób jak normalne, używając 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)); 
} 

pamiętać, że jeśli struktura eksponuje właściwości (jak to prawie na pewno powinien) można użyć Type.GetProperties, aby uzyskać na nich.

(Jak wspomniano w komentarzach, może to nie być dobra rzecz na pierwszym miejscu, i ogólnie Jestem podejrzliwy wobec zdefiniowanych przez użytkownika struktur, ale myślałem, że będę zawierać rzeczywistą odpowiedź w każdym razie ...)

EDIT: teraz wydaje się, że jesteś zainteresowany ustawienie polach, to nieco bardziej skomplikowane ze względu na sposób typy wartości pracy (i tak, to naprawdę nie powinnobyć struct .) Będziesz chciał umieścić po, ustawić wartości w pojedynczej instancji pudełkowej, a następnie rozwinąć na końcu:

object boxed = new MyStruct(); 

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

MyStruct unboxed = (MyStruct) boxed; 
+0

Dzięki za odpowiedź! Ale wygląda na to, że mogę robić niepotrzebnie skomplikowane rzeczy. Zobaczę, czy uda mi się osiągnąć to samo, używając list. – kr13

+0

"Należy zauważyć, że jeśli struktura ujawnia właściwości (jak prawie na pewno powinno), można użyć Type.GetProperties, aby uzyskać na nich."? Czy mogę zapytać, dlaczego struktura powinna eksponować właściwości? Dlaczego nie proste zmienne? – Naresh

+0

@Naresh: ponieważ pola powinny być problemem związanym z przechowywaniem, a nie częścią publicznego interfejsu API - przynajmniej w prawie wszystkich przypadkach. (Są wyjątki.) Zobacz http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx –