2009-03-19 16 views
3

Ich möchte in der Lage sein, die Werte einer Struktur in C# (.NET 2.0) zu durchlaufen. Dies ist zur Laufzeit ohne Kenntnis der möglichen Werte in der Struktur durchzuführen.Iterate durch ein Struct?

Ich dachte entlang der Linien von entweder Reflection zu verwenden, um die Strukturwerte zu einer Liste hinzuzufügen, oder die Struktur in eine Datenstruktur zu konvertieren, die die IEnumerable-Schnittstelle implementiert. Kann mir jemand Hinweise geben?

Vielen Dank im Voraus für Ihre Hilfe.

Grüße, Andy.

+0

Sind Sie sicher, you'r wirklich nicht Enum Sinn statt struct ?. Die Frage wird in diesem Fall einen Sinn haben –

Antwort

10

Was genau meinen Sie - die verschiedenen Felder innerhalb einer Struktur? Oder Eigenschaften vielleicht? Wenn ja, Type.GetFields() oder Type.GetProperties() ist der Weg zu gehen.

Sind Sie absolut sicher, dass Sie eine Struktur verwenden müssen, übrigens? Das ist selten die beste Designentscheidung in C#, insbesondere wenn die Struktur mehrere Werte enthält.

EDIT: Ja, es scheint, dass Strukturen aus Legacy-Gründen verwendet werden.

Eine Sache, die ich vorher nicht erwähnt habe: Wenn die Felder der Struktur nicht öffentlich sind, müssen Sie entsprechende BindingFlags angeben (z. B. BindingFlags.Instance | BindingFlags.NonPublic).

+0

Jon, Ich würde es vorziehen, sie selbst zu vermeiden, aber ich habe es mit einer Legacy-Anwendung zu tun. Danke für deinen Rat. – MagicAndi

+1

Jon, Danke nochmal. Ich konnte mit folgendem Code iterieren: Typ structType = typeof (MyStruct); FieldInfo [] Felder = structType.GetFields(); Foreach (FieldInfo-Feld in Feldern) {...} – MagicAndi

0

Damit es auf jeder Struktur funktioniert, müssen Sie die Reflektion verwenden. Wenn Sie eine Reihe von Strukturen mit dieser Fähigkeit erklären wollen, können Sie sie IEnumerable<KeyValuePair<string, object>> machen implementieren und definieren GetEnumerator() als:

yield return new KeyValuePair<string, object>("Field1", Field1); 
yield return new KeyValuePair<string, object>("Field2", Field2); 
// ... and so forth 
2

Auf der einfachsten Ebene unter der Annahme, dass Sie über die Eigenschaften iterieren wollen:

PropertyInfo[] properties = myStructInstance.GetType().GetProperties(); 
foreach (var property in properties) { 
    Console.WriteLine(property.GetValue(myStructInstance, null).ToString()); 
} 
1

Ich verwende etwas wie folgt aus:

[StructLayout(LayoutKind.Sequential)] 
public struct MY_STRUCT 
{ 
    public uint aa; 
    public uint ab; 
    public uint ac; 
} 

MY_STRUCT pMS = new MY_STRUCT(); 

FieldInfo[] fields = pMS.GetType().GetFields(); 
foreach (var xInfo in fields) 
    Console.WriteLine(xInfo.GetValue(pMS).ToString());