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 :

Obtenir la valeur d'une propriété par Reflection [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 30
    Points
    30
    Par défaut Obtenir la valeur d'une propriété par Reflection
    Est il possible d'obtenir la valeur d'une propriété d'une classe membre d'une autre classe par reflection en silverlight?
    En simple j'ai deux classes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Person 
    {
         public string Name {get; set;}
    }
     
    public class Client
    {
         public Person Person {get; set;}
    }
    j'ai une datagrid qui a pour ItemsSource une liste de Client.
    Je souhaite recupérer la valeur de Person.Name de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (object data in dataGrid.ItemsSource)
    {
         foreach (DataGridColumn col in dGrid.Columns)
         {
              Binding objBinding = (col as DataGridBoundColumn).Binding;
              PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path);
              pi.GetValue(data, null).ToString();
         }
    }
    objBinding.Path.Path est bien égale à "Person.Name", mais PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path) est toujours null.
    Savez vous s'il est possible de récupérer la valeur de Name?

    J'ai beaucoup simplifié l'exemple pour vous montrer seulement ce que je cherche a savoir. Si cela rend mon problème confus, n'hésitais pas à me demander mon exemple entier.
    En vous remerciant!

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    L'approche suivie est correcte. As-tu vérifié la valeur du type renvoyé par GetType() et le nom renvoyé par Path.Path ?
    Attention en revanche : avec Silverlight et le code Medium Trust le membre désiré doit être visible depuis le type appelant. Dans ton code original tout est-il bien déclaré en public comme dans l'exemple que tu viens de fournir?

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    J'ai reussi a le faire marcher mais en parcourant tous les éléments et en effectuant de la reflexion pour chaque element :
    (code en VB)


    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
     Dim p = New Person()
            p.Name = "Jeremy"
     
            Dim c = New Client()
            c.Person = p
     
     
            Dim chemin = "Person.Name"
     
            Dim listeProperty = chemin.Split(".")
     
            Dim objet As Object
            objet = c
            For Each prop In listeProperty
     
                Dim pro = objet.GetType().GetProperty(prop)
                objet = pro.GetValue(objet)
            Next
     
            Console.WriteLine(objet)
            Console.ReadLine()

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 30
    Points
    30
    Par défaut
    Je vous remercie de votre aide.
    Drezounet ta solution fut la bonne pour moi.

    Au propre ça donne cela:

    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
     
    foreach (object data in dataGrid.ItemsSource)
    {
         foreach (DataGridColumn col in dGrid.Columns)
         {
              Binding objBinding = (col as DataGridBoundColumn).Binding;
              PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path);
              if(pi != null)
                  pi.GetValue(data, null).ToString();
              else
              {
                      try
                      {
                            string[] properties = objBinding.Path.Path.Split('.');
                            int index = 0;
                            object obj = null;
                            foreach(string prop in properties)
                            {
                                  if (obj == null)
                                  {
                                        PropertyInfo pro = data.GetType().GetProperty(properties[index]);
                                        obj = pro.GetValue(data, null);
     
                                  }
                                  else
                                  {
                                        PropertyInfo pro = obj.GetType().GetProperty(properties[index]);
                                        obj = pro.GetValue(obj, null);
                                  }
                                  index++;
                           }
     
                     }
                     catch(Exception e)
                     {
                           Console.WriteLine(e.Message);
                      }
              }
     
         }
    }

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

Discussions similaires

  1. Lire la valeur d'une propriété CSS par le Javascript
    Par boutmos dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 11/07/2008, 16h56
  2. obtenir une valeur d'une map par reflexion
    Par al3alwa dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/12/2007, 17h55
  3. Réponses: 6
    Dernier message: 12/05/2006, 15h20
  4. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34
  5. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47

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