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

Dotnet Discussion :

[Reflexion] => GetProperty() d'un index de liste


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut [Reflexion] => GetProperty() d'un index de liste
    Bonjour @ tous,

    Je fais de la réflexion, et je crois que je vais devenir fou !
    J'ai un objet qui contient des propriétés et une liste d'autres objets.
    j'arrive à récupérer tout ce qui est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    obj1.libelle
    obj1.obj2
    obj1.obj3[1].libelle (grace au "if ((val is IEnumerable) && (idx>=0)) { // Pour les listes"... )
    Avec cette fonction :
    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
            /// <summary>Récupère les meta-information de la propriétés "pPropertyName".</summary>
            /// <returns>Item1=PropertyInfo, Item2=ObjetParent, Item3=ValeurDeLaPropriété</returns>
            public static Tuple<PropertyInfo, object, object> GetPiByName(object pObj, string pPropertyName) {
                PropertyInfo pi = null;
                object val = pObj;
                object valParent = null;
                Type currentType = val.GetType();
                var idx = -1;
                foreach (string propertyName in pPropertyName.Split('.')) {
                    if ((val is IEnumerable) && (idx>=0)) { // Pour les listes
                        pi = pi.PropertyType.GetGenericArguments()[0].GetProperty(propertyName);
                        currentType = pi.PropertyType;
                        valParent = ((IList)val)[idx];
                        val = pi.GetValue(valParent, null);
                        idx = -1;
                        continue;
                     } // */
     
                    var posi = propertyName.IndexOf('[');
                    if ((posi>0) && int.TryParse(propertyName.Substring(posi + 1, propertyName.Length - propertyName.IndexOf(']')), out idx)) {
                        pi = currentType.GetProperty(propertyName.Substring(0, posi));
                    } else
                        pi = currentType.GetProperty(propertyName);
                    currentType = pi.PropertyType;
                    valParent = val;
                    val = pi.GetValue(val, null);
                }
                return new Tuple<PropertyInfo, object, object>(pi, valParent, val);
            }
    Par contre, je n'arrive pas à récupérer :
    tout court. C'est juste une List<obj3>, j'aimerais retourner l'objet racine, et pas une de ses sous propriétés

    Je ne trouve pas la méthode pour me renvoyer le PropertyInfo d'un élément de liste par son index.

    J'ai modifié la méthode et j'y suis presque, mais il me manque le PI
    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
            public static Tuple<PropertyInfo, object, object> GetPiByName(object pObj, string pPropertyName) {
                PropertyInfo pi = null;
                object val = pObj;
                object valParent = null;
                Type currentType = val.GetType();
                var idx = -1;
                foreach (string propertyName in pPropertyName.Split('.')) {
                    var posi = propertyName.IndexOf('[');
                    if ((posi>0) && int.TryParse(propertyName.Substring(posi + 1, propertyName.Length - propertyName.IndexOf(']')), out idx)) {
                        pi = currentType.GetProperty(propertyName.Substring(0, posi));
                        currentType = pi.PropertyType;
                        valParent = val;
                        val = pi.GetValue(val, null);
                        if ((val is IEnumerable) && (idx >= 0)) { // Pour les listes
                            valParent = val;
                            val = ((IList)val)[idx];
                            currentType = val.GetType();
                            pi = ??? Je met quoi là ???
                            idx = -1;
                            continue;
                        } // */
                    } else
                        pi = currentType.GetProperty(propertyName);
                    currentType = pi.PropertyType;
                    valParent = val;
                    val = pi.GetValue(val, null);
                }
                return new Tuple<PropertyInfo, object, object>(pi, valParent, val);
            }
    Est ce que quelqu'un a une idée ?

    Merci d'avance.

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est tout à fait normal que tu n'y arrives pas. obj3[1] est un objet, pas une propriété. Impossible donc d'avoir le PropertyInfo correspondant !

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour François,

    Merci pour ta réponse.
    En effet, je me suis dit ça, mais on objet de base (obj1) possède des propriétés qui elles, sont aussi des objets.
    Et si je fait "obj1.obj2" dans ma méthode, mon PropertyInfo est bien du type de l'objet en question.
    J'aimerais pouvoir faire la même chose avec mon élément de tableau (récupérer le type) afin de faire quelque chose de générique.

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Mais un élément de tableau n'est pas une propriété.

    Une propriété, c'est une ou deux méthodes (un get et/ou un set) sans paramètres.

    Accéder à un élément d'un tableau, c'est appelé un indexer avec un paramètre. C'est complètement différent ! D'où l'impossibilité d'utiliser un ParameterInfo pour représenter un élément précis d'un tableau par son index. Cela ne veut pas dire que ce n'est pas possible d'utiliser la réflexion pour faire ce que tu souhaites pas, juste qu'il n'est pas possible d'utiliser un objet de type ParameterInfo.

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Entendu.

    Juste pour aller jusqu'au bout, sortons du contexte du tableau... Vu que je récupère tous les éléments (a mon avis) nécessaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                            valParent = val; // Parent
                            val = ((IList)val)[idx]; // Valeur
                            currentType = val.GetType(); // Type de la valeur
    Ca va faire 2 pierres d'un coup car je me posais aussi la même question pour l'élément racine (obj1 tout court).

    Il est impossible de récupérer le propertyInfo d'un objet sans que l'on aie son parent, donc.
    Et un objet indexé n'est pas considéré comme enfant de quelque chose...

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

Discussions similaires

  1. [AC-2002] Problème champ index et liste déroulante
    Par vortexlechien dans le forum IHM
    Réponses: 3
    Dernier message: 15/05/2009, 23h44
  2. Recherche d'index dans list ou array
    Par mister2502 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/04/2009, 20h40
  3. [MySQL] Indexer une liste déroulante sur le champ d'une table
    Par RootsRagga dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/12/2008, 21h39
  4. Utiliser les index de listes déroulantes dans un bloc séparé ?
    Par debie1108 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/05/2007, 08h43

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