2015-10-28 1 views
1

J'ai une classe qui retourne une Response2 qui ne comprend que deux définitions auxquelles je tiens:Itère classe DataContract

Response3.Id 
Response3.Name 

Mais, ces données sont retournées sous forme de liste, b/c ma définition de classe ressemble à ceci :

[DataContract] 
public class Response2 
{ 
    [DataMember(Name = "done")] 
    public bool done; 
    [DataMember(Name = "records")] 
    public List<Response3> r3entry; 
} 

[DataContract] 
public class Response3 
{ 
    [DataMember(Name = "Id")] 
    public string strId { get; set; } 
    [DataMember(Name = "Name")] 
    public string strName { get; set; } 
} 

maintenant, j'ai une liste de chaînes à itérer, mais lorsque je tente de faire ce qui suit:

Response2 propResponse2 = MakeRequest2(propertyRequest2, sfToken); 

foreach (string strId in propResponse2) 
{ 
    System.Windows.Forms.MessageBox.Show(strId.Name) 
} 

Je reçois une erreur indiquant: déclaration

foreach ne peut pas fonctionner sur des variables de type « Response2 » parce que « Response2 » ne contient pas de définition publique pour « GetEnumerator »

Je suppose que cela signifie que je J'ai besoin d'ajouter quelque chose au DataContract dans la classe, mais je ne suis pas sûr de savoir où le faire pour pouvoir correctement itérer.

Une aide?

+0

Vous devez provenir d'un monde 'JavaScript'. --- Je suppose que 'propResponse2' est de type' Response2'? Si oui, alors je suppose que vous essayez d'itérer sur les membres des données de la classe? 'foreach' ne le fera pas. Et il n'y a pas de telle bête. Je suppose que vous essayez de sérialiser la classe. Pour cela, utilisez 'DataContractSerializer' ou' NetDataContractSerializer' – GreatAndPowerfulOz

+0

Comment 'propResponse2' est-il défini? –

+1

@UweKeim, à partir du message d'erreur, il est évident qu'il est déclaré comme 'Response2' – GreatAndPowerfulOz

Répondre

2
foreach (var resp3 in propResponse2.r3entry) 
{ 
    System.Windows.Forms.MessageBox.Show(resp3.strName) 
} 
+0

cela a fonctionné, mais doit être changé en' resp3.strName' – gotmike

1

Pour faire ce que vous êtes désireux (si tel est bien ce que vous voulez), vous devez utiliser reflection

 foreach (var field in propResponse2.GetType().GetFields()) 
     { 
      System.Windows.Forms.MessageBox.Show(field.GetValue(propResponse2).ToString()); 
     } 

si d'autre part, vous êtes désireux d'obtenir toutes les [DataContract ] propriétés de tous les champs, puis:

foreach (DataContract dc in propResponse2.GetType() 
      .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      .Where(m => m.GetCustomAttributes(typeof(DataContract), false).Length > 0) 
      .SelectMany(m => m.GetCustomAttributes(false).OfType<DataContract>()).ToArray()) 
{ 
System.Windows.Forms.MessageBox.Show(dc.Name); 

} 
+0

alors quel est l'inconvénient de itération à travers cette liste? Je ne suis pas sûr de comprendre pourquoi la réflexion est mauvaise et que toutes les propriétés de tous les champs sont bonnes? le problème n'est pas que je veux seulement "quelques" des propriétés, mais plutôt que cela soit défini comme une liste, donc il y a beaucoup de "ensembles" de ces propriétés dans la liste et je veux parcourir ces éléments individuels. – gotmike

+0

@gotmike: Je n'ai pas dit que la réflexion est mauvaise. Je ne suis pas sûr de ce que tu veux. Voulez-vous les valeurs des champs de 'propResponse2' ou voulez-vous la valeur' DataContract.Name'? La réflexion est plus lente que l'accès à la compilation, mais la réflexion a été optimisée en C#. Le "problème" est que si c'est un code qui sera beaucoup exécuté, alors la réflexion est un problème de performance. – GreatAndPowerfulOz