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 :

Reflection sur des listes generiques: comment récuperer le type?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 324
    Par défaut Reflection sur des listes generiques: comment récuperer le type?
    J aimerais pouvoir lire toutes les champs et propriétés d une classe par reflection.
    Pour les types de base ou les classes normales, c est bon, mais pour les listes d objects, je ne trouve pas comment récuperer le type de ces objets.

    Voilà ma méthode de test.
    Là où je coince, c est pour fi.FieldType.IsGenericType. J ai typiquement ici une list d object, et j'aimerais recuperer ces objets...

    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
    private static void GetComponentReflected(object compObj)
            {
                Console.WriteLine("GetComponentReflected");
                Type objType = compObj.GetType();
                if (!objType.IsClass)
                    return;
                Console.WriteLine(objType.Name);
                foreach (FieldInfo fi in objType.GetFields())
                {
                    object val = fi.GetValue(compObj);
                    if (val == null)
                        continue;
                    if (fi.FieldType.Namespace == "ConsoleApplication2")
                        GetComponentReflected(val);
                    else if (fi.FieldType.IsGenericType)
                    {
                        if (fi.FieldType.Name.StartsWith("List"))
                        {
                            ICollection col = (ICollection)val;
                            foreach (object subObj in col)
                                GetComponentReflected(subObj); 
                        }
                        else
                            GetComponentReflected(val);
                    }
                    else
                    {   
                        displayKeyVal(fi.Name, val.ToString());
                    }
                }
           }
           private static void displayKeyVal(string name, string val)
           {
                Console.WriteLine("Name: " + name + ", Value:" + val);
           }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    Je vois que les objets de type "Type" ont une méthode "GetGenericArguments". ça a l'air d'être ce que tu recherches.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 324
    Par défaut
    merci, GetGenericArguments me renvoie en effet le type, mais j ai mal formulé mes besoins, c est aussi les objets eux memes (contenus ds ma liste) que j aimerais recupéré. Je tente avec des cast, mais pas vraiment fructueux...

    EDIT: c est bon, un cast en ICollection est possible (code edité + haut)
    La solution n est toutefois pas tres propre, je suis decu de voir que
    fi.FieldType.IsSubclassOf(typeof(ICollection)); ou
    fi.FieldType.IsSubclassOf(typeof(ICollection<object>));
    renvoie false.
    le fi.FieldType.BaseType étant "Object".

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

Discussions similaires

  1. pb sur des listes à 2 dimensions
    Par gerard tarquin dans le forum Général Python
    Réponses: 4
    Dernier message: 24/05/2007, 12h05
  2. Réponses: 5
    Dernier message: 27/02/2007, 11h43
  3. Liste d'iterateur sur des listes.
    Par jobherzt dans le forum C++
    Réponses: 5
    Dernier message: 24/11/2006, 14h06
  4. Problème de rafraîchissement de post sur des listes
    Par Greggggggg dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2006, 14h32
  5. [Javascript] Question pas difficile sur des listes dynamique...
    Par mulbek dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 09h55

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