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

ASP.NET Discussion :

Parcourir les propriétés d'une classe


Sujet :

ASP.NET

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut Parcourir les propriétés d'une classe
    Bonjour à toutes et à tous.

    J'ai créé une classe qui contient une trentaine de propriétés.
    J'aimerais maintenant pouvoir parcourir l'ensemble des propriétés afin d'en récupérer le nom ainsi que la valeur.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MaBellePetiteClasse
        Public Property UnePropriete As String
        Public Property UneSeconde As String
    End class
    Bien entendu, les propriétés sont définies correctement hein
    Maintenant je voudrais pouvoir faire dans le code quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i As Int32 = 0 To MaBellePetiteClasse.FautQueJeRecupèreLeCompteur
        SonNom = MaBellePetiteClasse.ProPriété(i)
        SaValeur = ????
    Next
    Bon voilà en gros ce que j'essaye d'exprimer

  2. #2
    Membre chevronné
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Par défaut
    Il faut faire de l'introspection (Reflection).

    En c# ça donnerait un truc du genre (je me rappel plus exactement)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PropertyInfo[] props = typeof(Maclasse).GetProperties(...)
     
    foreach(PropertyInfo p in props)
    {
     
    ...
    }
    En VB, je ne sais pas la syntaxe exact

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    J'avais oublié de préciser que j'ai déjà testé cette possibilité mais le problème est que je récupères toutes les propriétés même les GET et SET.
    Mon but est de n'avoir que celles que j'ai définies dans ma classe.
    Faut-il utiliser un truc du genre <Serialisable> ???

  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
    Par défaut
    Ben une propriété, c'est ça justement. C'est une méthode Get et une méthode Set.
    De plus quand je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (var info in typeof(String).GetProperties())
    {
        Console.WriteLine(info.Name);
    }
    J'obtiens bien Chars et Length.

    Montre nous le code que tu as utilisé.
    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 très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    Public Class StartOptions
     
        Public Sub New()
     
        End Sub
     
        Private _id As Int16 = 0
        Public Property Id() As Int16
            Get
                Return _id
            End Get
            Set(ByVal value As Int16)
                _id = value
            End Set
        End Property
     
        Private _serverId As Int16 = 0
        Public Property ServerId() As Int16
            Get
                Return _serverId
            End Get
            Set(ByVal value As Int16)
                _serverId = value
            End Set
        End Property
     
        Private _3GB As String = String.Empty
        Public Property GB() As String
            Get
                Return _3GB
            End Get
            Set(ByVal value As String)
                _3GB = value
            End Set
        End Property
     
        Private _baseVideo As String = String.Empty
        Public Property BaseVideo() As String
            Get
                Return _baseVideo
            End Get
            Set(ByVal value As String)
                _baseVideo = value
            End Set
        End Property
     
        Private _baudRate As String = String.Empty
        Public Property BaudRate() As String
            Get
                Return _baudRate
            End Get
            Set(ByVal value As String)
                _baudRate = value
            End Set
        End Property
    Donc, voici ce que j'ai pour le moment : une classe comportant une 30aine de propriétés et je voudrais pouvoir lister ces propriétés et obtenir leur valeur

    Possible ou non ?

  6. #6
    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
    Par défaut
    Oui c'est possible, le code à utiliser t'a été donné. Maintenant, ce qui nous intéresse, c'est de voir le code que tu utilisais et qui te permettait de dire que cette approche ne fonctionne pas. Tu as dû te planter quelquepart.
    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

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    C'est juste car si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        For Each info As PropertyInfo In GetType(StartOptions).GetProperties()
     
                    Console.WriteLine(info.Name)
     
                Next
    J'obtiens bien les noms des propriétés par rapport à tantôt où j'obtenais quelque chose de différent car je ne faisais pas comme proposé ci-dessus.

    Ce que je n'arrive pas à faire c'est récupérer les valeurs alors que maintenant j'ai bien le nom

  8. #8
    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
    Par défaut
    Voila un exemple C# (mon VB.NET est approximatif), tu devras convertir :
    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
            static void Main(string[] args)
            {
                String toto = "test";
     
                foreach (var info in typeof(String).GetProperties())
                {
                    Console.WriteLine(info.Name);
     
                    if (info.GetIndexParameters().Length == 0)
                    {
                        Console.WriteLine(info.GetValue(toto, null));
                    }
                    else
                    {
                        Console.WriteLine(info.GetValue(toto, new object[] { 0 }));
                    }
                }
            }
    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

  9. #9
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Salut,

    Finalement j'ai réussi à obtenir les informations de mes propriétés et les valeurs via le code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim startOption As StartOptions = bllServer.GetStartOptions(serveur.IdServer)
    For Each info As PropertyInfo In GetType(StartOptions).GetProperties()
     
        Try
     
            Dim unControle As Label = Page.FindControl("lblStartOption" & info.Name)
            unControle.GetType().InvokeMember("Text", BindingFlags.SetProperty, Nothing, info.Name & " - " & info.GetValue(startOption, Nothing), Nothing)
     
        Catch
        Finally
        End Try
    Next
    Le problème qui se pose maintenant est le Page.FindControl qui me retourne toujours Nothing ... ? ...
    J'ai, dans ma page, créé des Label nommés lblStartOptionNomDesPropriétés
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <asp:Label ID="lblStartOptionBaseVideo" runat="server"></asp:Label><br />
    <asp:Label ID="lblStartOptionFastDetect" runat="server"></asp:Label><br />
    <asp:Label ID="lblStartOptionRedirect" runat="server"></asp:Label><br />
    <asp:Label ID="lblStartOptionExecuteOption" runat="server"></asp:Label><br />
    Info.Name me retourne les noms des propriétés correctement.
    lblStartOption & Info.Name me retourne bien lblStartOptionNomDesPropriétés

    Mais je ne comprends pas pourquoi le Page.FindControl("lblStartOption" & info.Name) ne fonctionne pas.

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Et bien voilà, j'ai trouvé la solution :

    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
    28
    29
    30
    31
    32
    33
    34
     
    Dim startOption As StartOptions = bllServer.GetStartOptions(serveur.IdServer)
                Dim LabelRecherche As String = String.Empty
                Dim unControle As Label
     
                For Each info As PropertyInfo In GetType(StartOptions).GetProperties()
     
                    If info.GetValue(startOption, Nothing).ToString() <> "" Then
     
                        Try
     
                            LabelRecherche = String.Empty
     
                            If info.Name = "GB" Then
                                LabelRecherche = "lblStartOption3GB"
                            Else
                                LabelRecherche = "lblStartOption" & info.Name
                            End If
     
                            If Not (RechercheControle(Master, LabelRecherche)) Is Nothing Then
     
                                unControle = RechercheControle(Master, LabelRecherche)
                                GetType(Label).InvokeMember("Text", BindingFlags.SetProperty, System.Type.DefaultBinder, RechercheControle(Master, LabelRecherche), New Object() {info.Name & " - " & info.GetValue(startOption, Nothing)})
                                RechercheControle(Master, "CellStartOption" & info.Name).Visible = True
     
                            End If
     
                        Catch
                        Finally
                        End Try
     
                    End If
     
                Next
    ¨

    Le problème venait du fait que FindControl ne fait pas un récurssif => une petite fonction s'impose :
    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
     
        Private Function RechercheControle(ByRef Root As Control, ByVal Id As String) As Control
     
            If (Root.ID = Id) Then Return Root
     
            For Each Ctl As Control In Root.Controls
     
                Dim FoundCtl As Control = RechercheControle(Ctl, Id)
                If Not FoundCtl Is Nothing Then Return FoundCtl
     
            Next
     
            Return Nothing
     
        End Function

  11. #11
    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
    Par défaut
    Tu devrais stocker la valeur retournée par RechercheControle dès le premier appel et réutiliser cette variable dans le reste du code, ça te permettrait de gagner un peu en performance et surtout en lisibilité
    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

  12. #12
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Saumon,

    Merci pour ton explication !

    J'ai maintenant modifié le code pour que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                            unControle = RechercheControle(Master, LabelRecherche)
     
                            If Not (unControle) Is Nothing Then
     
                                GetType(Label).InvokeMember("Text", BindingFlags.SetProperty, System.Type.DefaultBinder, unControle, New Object() {info.Name & " - " & info.GetValue(startOption, Nothing)})
                                RechercheControle(Master, "CellStartOption" & info.Name).Visible = True
     
                            End If

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/10/2008, 13h04
  2. Parcourir les éléments d'une classe
    Par rvhp2 dans le forum Langage
    Réponses: 10
    Dernier message: 01/10/2008, 20h06
  3. [VB.NET 2005] Parcourir les propriétes d'une Class
    Par ricil78 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/03/2007, 22h47
  4. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 23h59
  5. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 10h47

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