IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Parcourir un objet


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut Parcourir un objet
    Bonjour à tous!

    J'ai peu d'expérience en C# et j'ai un projet de sérialisation générique de classe à faire.
    Mon problème se situe au niveau des array, je n'arrive pas à les parcourir.

    D'abord, voici ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public class test {
            public int a = 4;
            public int[] b = { 2, 4, 6, 8 };
            //public float[,] c = { { 2.2f, 3.3f }, { 4, 5 } };
        }
    On peut parcourir un objet grâce à GetType() comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                //test myObject = new test();
               for (int i = 0; i < myObject.GetType().GetFields().Length; i++)
                    myObject.GetType().GetFields()[i].GetValue(myObject).ToString(); //valeur de chaque champs
    Avec cette technique, je peux récupérer la valeur de "a" mais pour un array comme "b", je n'arrive pas à récupérer les valeurs. L'affichage de la valeur me donne "System.Int32[]", normal.

    J'espère que j'ai réussi à être à peu près clair.
    Je vous remercie beaucoup si vous pouvez m'éclairer parce que ça me saoule vraiment

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu stockes le GetValue dans un object, ensuite tu testes si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monobject is IEnumerable
    Si oui, tu foreach dessus et tu tostring chaque valeur.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse rapide.
    Je suis pas sûr d'avoir tout compris vu que je suis plutôt débutant

    J'ai stocké mon getvalue dans un objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object objtest = myObject.GetType().GetFields()[i].GetValue(myObject);
    mais après, impossible de travailler dessus car ce n'est pas un Int32[].
    Si j'essaie de regarder la taille de l'objet, j'obtiens 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objtest.GetType().GetFields().Length

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il veut te dire de faire un truc comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Object objtest = myObject.GetType().GetFields()[i].GetValue(myObject);
     
    if(objtest is IEnumerable)
    {
        foreach(object o in objtest)
        {
            Console.WriteLine(o.ToString());
        }
    }

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    J'avais essayé quelque chose de ce genre mais ça me donne des erreurs:
    Erreur 1 sur "IEnumerable" : L'utilisation du type 'System.Collections.Generic.IEnumerable<T>' générique requiert les arguments de type '1'
    Erreur 2 sur "foreach" : l'instruction foreach ne peut pas fonctionner sur des variables de type 'object', car 'object' ne contient pas de définition public pour 'GetEnumerator'

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Pour la première erreur, pense à inclure dans tes using :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Collections;

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    pour corriger la seconde erreur :

    Pour effectuer un foreach il te faut un IEnumerble et 'object' ne l'est pas.
    Tu peux alors faire un cast de ton objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            IEnumerable tt = objtest as IEnumerable;
            foreach( var o in tt ) {
              Console.WriteLine( o.ToString() );
            }

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Un grand merci! Ca faisait depuis hier soir que je bloquais sur ce problème, j'ai essayé de diverses manières tordues en vain... Vous assurez!

    Bon, j'ai quand même une dernière question:
    les types anonymes càd var (que je viens de découvrir grâce à toi, binoo) ne fonctionne pas chez moi et j'en ai vraiment besoin puisque je ne connais pas le type à l'avance. Comment ça se fait?
    J'ai Visual Studio 2005, framework.net 3

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Les types anonymes sont pourtant arrivés avec le framework.net 3.0 (à ma connaissance).

    Il faut savoir que tu ne peux pas faire :
    mais ça :
    car le type est déduit lors de la compilation.
    Peut-être est-ce là ton erreur ?

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Je me suis renseigné et c'est bien à partir de la version 3.0 qu'ils sont arrivés en effet.

    C'est à cette ligne que ça bloque.

    Il y a un using particulier à rajouter?

    Comment puis-je savoir quelle version du framework est utilisée?
    J'ai pas encore bcp de connaissance, je l'ai juste installé, peut-être qu'il manque une étape :s

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par ragnarokr Voir le message
    Comment puis-je savoir quelle version du framework est utilisée?
    Je crois qu'il y a une commande mais j'arrive plus à m'en suvenir.
    J'ai donc utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Version ver = Environment.Version;
                Console.WriteLine("Version Framework = {0}", ver);
    Et en fait ma version du framework est la 2.0 alors que j'ai installé la 3.0 mais je ne sais pas comment sélectionner la 3.0...

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    tu as pensé à redémarrer Visual ?

    Je me demande s'il y a pas une option dans les propriétés de ton projet pour choisir le framework à utiliser (avec Visual Studio 2008 je sais qu'elle y est mais je crois pas qu'elle y soit avec le 2005) ?

    Sinon peut-être qu'il faut recréer le projet de zéro pour qu'il prenne en compte le changement (mais je pense qu'il a un moyen de faire plus simplement).

  13. #13
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Il y a longtemps que j'avais installé la version 3.0 mais je n'avais pas vérifié qu'elle soit bien active.
    Il n'y a pas moyen de choisir la version à utiliser sur un projet avec VS2005 apparemment.
    J'ai bien peur qu'il me faille VS2008 pour pouvoir l'utiliser

  14. #14
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    var c'est .NET 3.5 à ma connaissance.
    .NET 3.0 n'a pas introduit de nouveautés au niveau des langages. Ce sont simplement les technologies .NET 2.0 + W*F + CardSpaces.

    3.5, par contre, introduit des extensions des langages C# (3.0) et VB.NET (9.0 je crois).

  15. #15
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Même en installant la version 3.5, je reste à la 2.0

    Je sais pas trop comment je vais faire si je ne peux pas utiliser "var" pour que le code soit propre.

  16. #16
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    J'avais mis 'var' par habitude : mais en mettant 'object' ca devrait marcher non ?

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Ha ben oui J'suis fatigué...

    Binou, décidement, tu m'auras fait gagner beaucoup de temps.
    Merci pour tout

    Même si j'ai pas compris pourquoi je reste bloqué à la version 2.0 du framework, on peut considérer que mon problème est résolu.

    Je vous souhaite à tous une bonne soirée/nuit!
    J'vais essayer de m'améliorer fortement en c# pour que je puisse, un jour, vous aider à mon tour

  18. #18
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 16
    Points
    16
    Par défaut Parcourir un objet
    Bonjour,

    Le sujet n'est certainement plus d'actualité...mais voilà un code plus simple qui marche très bien.

    public class test
    {
    public System.Collections.IEnumerator GetEnumerator()
    {
    int a = 4;
    int[] b = { 2, 4, 6, 8 };

    for (int i = 0; i <b.Length; i++)
    {
    yield return b[i];
    }
    }
    }

    class Program
    {
    static void Main(string[] args)
    {

    test listClass1 = new test();

    foreach (int elt in listClass1)
    {
    System.Console.WriteLine(elt);
    }
    }
    }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment parcourir un objet json?
    Par aminaoussaleh dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 08/12/2009, 17h08
  2. [POO] parcourir un objet json avec une boucle for in
    Par bucheron007 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 19/01/2009, 13h55
  3. Parcourir un objet Collection
    Par 3KyNoX dans le forum C#
    Réponses: 8
    Dernier message: 30/11/2008, 23h14
  4. Parcourir un objet
    Par Manitobaa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/10/2008, 17h43
  5. parcourir un objet
    Par Jasmine80 dans le forum Langage
    Réponses: 9
    Dernier message: 13/06/2008, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo