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 :

Foreach sur les membres d'une classe


Sujet :

C#

  1. #1
    Membre régulier Avatar de titan_33
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 91
    Points
    91
    Par défaut Foreach sur les membres d'une classe
    Bonjour

    Est-il possible de boucler sur les membres d'une classe comme on peut le faire en PHP

    Exemple : j'ai la classe CTest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class CTest
    {
        private string _sVar1;
        private string _sVar2;
        private int _iVar3;
     
        public string sVar1
        {
            set { _sVar1 = value; }
            get { return _sVar1; }
        }
     
        public string sVar2
        {
            set { _sVar2 = value; }
            get { return _sVar2; }
        }
     
        public int iVar3
        {
            set { _iVar3 = value; }
            get { return _iVar3; }
        }
     
    }
    je voudrais faire un traitement spécifique sur les membres de type String

    Cela pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            CTest oCTest = new CTest();
            oCTest.sVar1 = "merci";
            oCTest.sVar2 = "super";
            oCTest.iVar3 = 10;
    
            foreach (object oPropriete in oCTest)
            {
                if (oPropriete.GetType().ToString() == "STRING")
                    // Je récupère la valeur de oPropriete et je la mets en majuscule
            }
    enfin ça marche pas du tout.

    Merci de votre précieuse expérience.

    Titan

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Il faut utiliser la reflection et nottement PropertyInfo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                foreach (PropertyInfo info in typeof(Form1).GetProperties())
                {
                    MessageBox.Show(info.PropertyType.ToString());
                }

  3. #3
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    juste une petite précision pour tester le type, au lieu de faire comme tu as fait dans ton pseudo exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (oPropriete.GetType().ToString() == "STRING")
    je te conseillerais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (oPropiete.GetType() == typeof(string))
    rien de plus à rajouter sinon ^^
    ****** Analyse/Développeur .Net

  4. #4
    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
    Citation Envoyé par SoBaKa Voir le message
    je te conseillerais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (oPropiete.GetType() == typeof(string))
    Ceci me semble tout de même plus intuitif lors de la lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (oPropriete is String)
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre régulier Avatar de titan_33
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 91
    Points
    91
    Par défaut
    Merci à vous, j'arrive désormais à faire le traitement que j'attendais.

    Toutefois je n'ai pas réussi la comparaison sur le type en utilisant GetType() ou typeof, il y avait toujours un problème de compilation.

    Donc j'ai utilisé (pInfo.PropertyType.ToString() == typeof(String).FullName) qui fonctionne mais qui me plait moyennement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            foreach (PropertyInfo pInfo in typeof(CTest).GetProperties())
            {
                if (pInfo.PropertyType.ToString() == typeof(String).FullName) // Retourne "System.String"
                {
                    sData = (string)pInfo.GetValue(oCTest, null);
                    sData = sData.ToUpper();
                    pInfo.SetValue(oCTest, sData, null);
                }
            }
    La classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class CTest
    {
        private string _sVar1;
        private string _sVar2;
        private int _iVar3;
     
        public string sVar1
        {
            set { _sVar1 = value; }
            get { return _sVar1; }
        }
     
        public string sVar2
        {
            set { _sVar2 = value; }
            get { return _sVar2; }
        }
     
        public int iVar3
        {
            set { _iVar3 = value; }
            get { return _iVar3; }
        }
     
    }
    
    Quelqu'un aurait-il une explication.

    Encore une fois, merci à vous.

    Titan

  6. #6
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Ceci me semble tout de même plus intuitif lors de la lecture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (oPropriete is String)
    arf ce put*** de is que j'oublie toujours lol

    titan_33

    pInfo.PropertyType te retourne un objet de type "Type" non?

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pInfo.PropertyType == typeof(String))
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pInfo.PropertyType is String)
    ****** Analyse/Développeur .Net

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par SoBaKa Voir le message
    arf ce put*** de is que j'oublie toujours lol

    titan_33

    pInfo.PropertyType te retourne un objet de type "Type" non?

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pInfo.PropertyType == typeof(String))
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pInfo.PropertyType is String)
    euh, non

    pInfo.PropertyType est un Type. Donc (pInfo.PropertyType is string) renvoit false ; seul (pInfo.PropertyType is Type) est vrai.

    Donc : Il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pInfo.PropertyType == typeof(String))
    parce que "is" permet de tester le type de l'instance d'un objet.
    ಠ_ಠ

  8. #8
    Membre régulier Avatar de titan_33
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 91
    Points
    91
    Par défaut Le mot de la fin
    Désolé SoBaKa mais Guulh a effectivement raison.

    if (pInfo.PropertyType == typeof(String)) n'a pas fonctionné, il n'arrive pas à détecter les string alors que if (pInfo.PropertyType == typeof(String)) le fait à la perfection.

    Merci à vous tous pour vos connaissances et votre temps.

    A+

    Titan

  9. #9
    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 t'es planté dans ton copier/coller
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre régulier Avatar de titan_33
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 91
    Points
    91
    Par défaut
    Effectivement if (pInfo.PropertyType is String) ne fonctionne pas

    Désolé

  11. #11
    Membre régulier Avatar de titan_33
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 91
    Points
    91
    Par défaut
    Demande cloturée

    Merci

    A+

    Titan

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  2. Réponses: 4
    Dernier message: 16/01/2007, 15h27
  3. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 22h59
  4. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49

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