2009-01-07 6 views
2

Je suis en train de coder en C# et j'ai un dictionnaire avec des tonnes de données. Un des membres est "enfants" mais quand j'essaye d'écrire ses valeurs, je reçois: System.Object []C# Accès aux données dans System.Object []

Je sais que les enfants contiennent des données, probablement des données imbriquées, mais je ne suis pas sûr que ce soit un liste, dictionnaire, tableau, etc.

Comment écrire toutes les données dans "enfants"?

Répondre

3

La réponse par défaut de tout type .NET instancié à "ToString()" consiste à écrire le nom de type complet. System.Object [] signifie que vous avez un tableau dans lequel chaque élément est de type "Object". Cette "boîte" pourrait contenir n'importe quoi puisque chaque type dans .NET dérive de l'objet. Ce qui suit peut vous dire ce que le tableau contient vraiment en termes de types instanciés:

foreach (object o in children) 
    Console.WriteLine(o != null ? o.GetType().FullName : "null"); 
+0

Eh bien, il est seulement une « boîte » si l'élément contenu est un type de valeur (à l'exception pour vide Nullable , qui devient null lui-même) –

2

Il fait un tableau de object références, de sorte que vous devrez parcourir et extraire les objets, par exemple:

// could also use IEnumerable or IEnumerable<object> in 
// place of object[] here 
object[] arr = (object[])foo["children"]; 

foreach(object bar in arr) { 
    Console.WriteLine(bar); 
} 

Si vous savez ce que les objets sont, vous pouvez lancer etc - ou vous pouvez utiliser les LINQ OfType/méthodes d'extension Avec:

foreach(string s in arr.OfType<string>()) { // just the strings 
    Console.WriteLine(s); 
} 

vous pouvez tester chaque ob Ject:

foreach(object obj in arr) { // just the strings 
    if(obj is int) { 
     int i = (int) obj; 
     //... 
    } 
    // or with "as" 
    string s = obj as string; 
    if(s != null) { 
     // do something with s 
    } 
} 

Au-delà, vous allez devoir ajouter plus de détails ...

+0

J'ai utilisé votre premier exemple et obtenu le résultat suivant: CookComputing.XmlRpc.XmlRpcStruct XmlRpcStruct est une "dérivation du type de hachage .NET et se compose de paires nom/membre représentant les membres de la structure XML-RPC". Est-ce que cela nécessite un autre itérateur? –

+0

Il n'y a aucun moyen pour moi de deviner quelles sont les données de votre système ... et XmlRpcStruct ne m'est pas familier, donc je ne peux pas commenter cela. –

+0

XmlRpcStruct est une dérivation du type de hachage .NET et se compose de paires nom/membre représentant les membres de la structure XML-RPC. Vous avez été très utile - merci de toute façon! –

1

(Note Je ne suis pas tester ce code dans VS, travailler hors mémoire ici).

object[] children = (object[])foo["children"]; 
foreach(object child in children) 
    System.Diagnostics.Debug.WriteLine(child.GetType().FullName); 

Cela devrait vider les noms de classe des enfants. Si vous faites un foreach sur foo ["children"] vous ne devriez pas avoir un échec à ce qu'un itérateur public ne soit pas trouvé puisque par définition un tableau en a un (sauf si j'ai manqué quelque chose).

+0

il semble que le dictionnaire est tapé comme , donc il faudra aussi un cast supplémentaire (voir mon exemple) –

+0

Désolé, mais cela renvoie l'erreur suivante: Impossible de convertir le type 'objet' en ' objet[]'. Une conversion explicite existe (manque-t-il un casting?) –

0

« Je sais que les enfants contient des données, des données probablement imbriquées, mais je ne suis pas sûr si elle est une liste, dictionnaire, tableau, etc »

Ainsi, le childreen est IEnumerable ou non une collection

essayer ce code

void Iterate(object childreen) 
{ 
    if(data is IEnumerable) 
    foreach(object item in data) 
     Iterate(item); 
    else Console.WriteLine(data.ToString()); 
} 
1

je me rends compte que ce fil est plus d'un an, mais je voulais poster une solution que j'ai trouvé au cas où quelqu'un est lutte à essayer d'obtenir des données sur l'System.Object [] est revenu en utilisant la Cook Computing XML-RPC Bibliothèque.

Une fois que vous avez les enfants objet retourné, utilisez le code ci-dessous pour afficher la clé/valeurs contenues dans:

foreach (XmlRpcStruct rpcstruct in Children) 
     { 
      foreach (DictionaryEntry de in rpcstruct) 
      { 
       Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); 
      } 
      Console.WriteLine(); 
     } 
+0

Avait espéré que cela mettrait fin à mon combat, mais je ne suis pas sûr que cela résout le problème. Beaucoup de valeurs sont imprimées sous System.Object [] –

Questions connexes