2009-03-19 5 views
3

J'aimerais pouvoir parcourir les valeurs d'une structure en C# (.Net 2.0). Cela doit être fait à l'exécution, sans aucune connaissance des valeurs possibles dans la structure. Je pensais à utiliser Reflection pour ajouter les valeurs de structure à une liste, ou à convertir la structure en une structure de données qui implémente l'interface IEnumerable. Quelqu'un peut-il fournir des pointeurs?Itérer à travers une structure?

Merci d'avance pour votre aide.

Cordialement, Andy.

+0

Êtes-vous sûr you'r ne signifie vraiment ENUM au lieu de struct ?. La question aura un sens dans ce cas –

Répondre

10

Que voulez-vous dire - les différents domaines au sein d'une structure? Ou des propriétés peut-être? Si oui, Type.GetFields() ou Type.GetProperties() est le chemin à parcourir.

Etes-vous absolument sûr que vous avez besoin d'utiliser une structure, d'ailleurs? C'est rarement la meilleure décision de conception en C#, en particulier si la structure contient plusieurs valeurs.

EDIT: Oui, il semble que les structures sont utilisées pour des raisons héritées.

Une chose que je n'ai pas mentionnée auparavant: si les champs de la structure ne sont pas publics, vous devrez spécifier les BindingFlags appropriés (par exemple, BindingFlags.Instance | BindingFlags.NonPublic).

+0

Jon, Je préférerais les éviter moi-même, mais j'ai affaire à une application héritée. Merci pour vos conseils. – MagicAndi

+1

Jon, merci encore. J'ai été capable d'itérer en utilisant le code suivant: Type structType = typeof (MyStruct); Champs FieldInfo [] = structType.GetFields(); Foreach (champ FieldInfo dans les champs) {...} – MagicAndi

0

Pour le faire fonctionner sur chaque structure, vous devez utiliser la réflexion. Si vous voulez déclarer un ensemble de struct avec cette capacité, vous pouvez les faire mettre en œuvre IEnumerable<KeyValuePair<string, object>> et définissent GetEnumerator() comme:

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

Au niveau le plus simple, en supposant que vous voulez itérer sur les propriétés:

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

J'utilise quelque chose comme ce qui suit:

[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()); 
Questions connexes