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 :

[VB.NET]Reflexion lister les membres d'une classe ...presque


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut [VB.NET]Reflexion lister les membres d'une classe ...presque
    Bonjour,

    Tout est dans le titre, je voudrais lister les membres d'une classe et surtout connaitre leur type. J'ai commencé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim t As Type
    t = type.GetType("nom_classe" & ", " & "nom_ddl", False, True)
    Dim res As Reflection.MemberInfo() = t.GetMembers
    Dim index As Integer
    For index = 0 To res.Length
          Dim nom As String = res(index).Name
          Dim type As Type = res(index).DeclaringType
          Dim nom_type As String = type.Name
          Dim ahah As Integer = 3
    Next index
    mais qd j'exécute pas à pas, t = nothing , ca doit venir de ce que je mets en param de type.GetType :

    est-ce qu'on peut appeler cette fonction pour la ddl sur laquelle on est en train de travailler :

  2. #2
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    personne n'a d'idees pour moi

  3. #3
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Ce qu'il faut donner comme argument ce n'est pas plutot le nom de ta classe préfixée par son namespace ? Et la recherche s'effectue sur les assemblies déja chargées.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type.GetType("System.String");
    Type.GetType("MonNameSpace.MaClasse");

  4. #4
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    ok ca ca marche, merci

    maintenant mon problème c'est que je ne sais pas comment récupérer le type des propriétés de ma classe, car le getType du niveau suivant ne reoturne que des system.type, or il y a des propriétés qui sont d'un type que j'ai défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    t = type.GetType("ma_ddl.ma_classe")
       Dim res As Reflection.PropertyInfo() = t.GetProperties
       Dim index As Integer
       For index = 0 To res.Length
           Dim nom As String = res(index).Name
           Dim type1 As Type = res(index).GetType
           Dim nom_type As String = type1.Name
       Next index

  5. #5
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    Le type de la propriété qui est encapsulée par le PropertyInfo se retrouve dans la propriété PropertyType, pas dans le GetType qui va te renvoyer forcemment un "PropertyInfo "

  6. #6
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    j'y suis presque, il fallait utiliser PropertyType :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim t As Type
    t = type.GetType("ma_ddl.ma_classe")
        Dim res As Reflection.PropertyInfo() = t.GetProperties
        Dim index As Integer
        For index = 0 To res.Length
           Dim nom As String = res(index).Name
           Dim type1 As Type = res(index).PropertyType
           Dim nom_type As String = type1.Name
        Next index
    Maintenant il faut que je trouve comment faire appel au constructeur correspondant, un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           if nom_type <> "classe_exclue"
               res(index) = new nom_type
           end if
    Sinon à tout hasard est-ce qu'il est possible à partir d'une chaine de caractère de faire une variable, comme en php ?

  7. #7
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    ah t'as été plus rapide à répondre

  8. #8
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    le schmilibic avance avec l'utilisation de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim toto As Object = Activator.CreateInstance(type1)
    j'ai la partie de droite . En fait les proriétés de ma classe sont partagées (shared) et je voudrais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim t As Type 
    t = type.GetType("ma_ddl.ma_classe") 
    Dim res As Reflection.PropertyInfo() = t.GetProperties 
    Dim index As Integer 
        For index = 0 To res.Length 
           Dim nom As String = res(index).Name 
           Dim type1 As Type = res(index).PropertyType 
           Dim nom_type As String = type1.Name 
     
           if nom_type <> "classe_exclue" 
               ma_classe.la_propriete_res(index) = Activator.CreateInstance(type1)
           end if 
        Next index

    si quelqu'un a une idée

  9. #9
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    personne ?

    le problème c'est que InvokeMember me permet de récupérer mes fonctions, mais pas mes propriétés et getProperties donnent des infos sur les propriétés, mais pas les propriétés elles-mêmes, ou alors j'ai rien compris :

  10. #10
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    Je comprends pas bien ce que tu cherches à faire exactement. Récupérer par réflexion les propriétés statiques d'une classe ? Si oui, alors il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PropertyInfo MaProp = ..... ;
    object Valeur = MaProp.GetValue(null, null);
    Sinon essaye d'expliquer un peu mieux ce que tu cherches a obtenir



    Sinon à tout hasard est-ce qu'il est possible à partir d'une chaine de caractère de faire une variable, comme en php ?
    Non tu ne peux pas. Par contre tu peux passer par un objet de type Hashtable qui te permettrai d'associer à un nom un objet. Ce qui revient presque au meme que ce que tu demandais. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Hashtable MaTable = new Hashtable();
     
    //On ajoute une "variable"
    MaTable.Add("Var1", new ArrayList());
     
    //On la récupere
    ArrayList Var1 = (ArrayList) MaTable["Var1"];
    Ici j'ai "créé" une variable "var1" de type ArrayList.

  11. #11
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PropertyInfo MaProp = ..... ;
    object Valeur = MaProp.GetValue(null, null);
    presque .... il faut que j'utilise le setvalue.

    Dernier prob apres je vous embete plus, je veux mettre la valeur à nothing, donc je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res(index).SetValue(Null, Nothing, Null)
    mais il veut pas de mes Null

  12. #12
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    le truc aussi c'est que je veux affecter une nouvelle instance à cette propriété, je pensais utiliser Activator.CreateInstance(type_recupere), mais je vois pas comment faire avec setvalue : :

  13. #13
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    personne n'a d'idée, eh bah ca n'inspire pas grande réflections ... la réflexion. ok je

  14. #14
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    alors j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    res(index).SetValue(Nothing, Activator.CreateInstance(type1), Nothing)
    Ca marche, sauf si la propriété est un string, auquel cas il me met que l'objet n'a pas de constructeur sans paramètre Serais-je obligée de mettre les strings dans une classe à part ?

  15. #15
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    La classe String n'a effectivement pas de constructeur par defaut, il faut obligatoirement fournir des arguments (je te laisse regarder la liste des constructeurs).

  16. #16
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    ok mais sinon ce que je fais ca te parait correct ?

  17. #17
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    Correct de quel point de vu ? "Programmatiquement" c'est correct si ça compile . Mais sans rire, je ne connais pas le probleme que tu essayes de résoudre, donc je ne peux pas te dire si ce que tu fais est la bonne solution. Cela dit je me pose des questions, par exemple je trouve étrange d'avoir besoin de positionner des membres statiques d'une classe que l'on ne connait pas, pourquoi est ce que ce n'est pas le constructeur statique qui s'en occupe ? Mais ne connaissant pas le probleme, je dis peut etre des betises...

  18. #18
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    En fait c'est une classe qui regroupe toutes nos variables de session. Ces variables (propriétés partagées) sont soit d'un type system, soit d'un type à nous. Lorsqu'on clique sur notre menu, on veut que certaines variables soit purgées, mais pas d'autres. Le but pour éviter de faire à la main toutes les initialisations : pas très propre je trouve, est de lister toutes les propriétés de la classe et qu'en fonction de leur type (on exclut un type particulier) on les purge ou pas. Le truc c'est que certaines variables étant du type NotreObjet par ex, il suffit pas de la vider, mais bien de la réinstancier, car sinon lorsqu'on fera l'appel dans la page ca nous mettra que l'élément n'est pas initialisé.

    Voilà je sais pas si je suis plus claire ?

  19. #19
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    Par défaut
    C'est clair, mais c'est étrange. Pourquoi pas simplement une fonction de votre classe qui s'appellerait "Purge" et qui s'occuperait elle meme de toute ses propriétés ?

    Le seul avantage que je vois c'est que ta méthode est "générique", c'est a dire que si vous rajoutez une propriété à ta classe, cette propriété sera bien remise à zéro par ta méthode si elle est du bon type, alors qu'avec une fonction "Purge" il faudrait purger explicitement cette nouvelle propriété. L'inconvénient de ta méthode c'est que je vois d'ici un jour ton boss te demander : à mais oui mais cette variable là du type qu'on pourge, finalement elle, juste elle, il faut pas la purger... et hop te voila partie dans la gestion de cas particuliers.

    Enfin bon, je trouve la solution employée bien lourde pour l'empleur du probleme, mais si vous trouvez ça nécessaire...

  20. #20
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par Sphax
    C'est clair, mais c'est étrange. Pourquoi pas simplement une fonction de votre classe qui s'appellerait "Purge" et qui s'occuperait elle meme de toute ses propriétés ?
    Bah en fait on fait un compromis, puisqu'on a bien une fonction purge dans cette classe, sauf "qu'elle s'occupe de ses propriétes" dynamiquement

    Citation Envoyé par Sphax
    Le seul avantage que je vois c'est que ta méthode est "générique", c'est a dire que si vous rajoutez une propriété à ta classe, cette propriété sera bien remise à zéro par ta méthode si elle est du bon type, alors qu'avec une fonction "Purge" il faudrait purger explicitement cette nouvelle propriété.
    Voilà c'est ce que je voulais dire t'as tout compris

    Citation Envoyé par Sphax
    L'inconvénient de ta méthode c'est que je vois d'ici un jour ton boss te demander : à mais oui mais cette variable là du type qu'on pourge, finalement elle, juste elle, il faut pas la purger... et hop te voila partie dans la gestion de cas particuliers.
    Eh bah non car plutot que de tester sur le type de la propriété je testerai sur son nom (voir les deux ) .... pas folle la break

    Citation Envoyé par Sphax
    Enfin bon, je trouve la solution employée bien lourde pour l'empleur du probleme, mais si vous trouvez ça nécessaire...
    Tu as sans doute raison maintenant, mais pour la maintenance je trouve ca plus simple et moins long. Et puis ca me permet de mettre la réflexion en pratique 8)

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

Discussions similaires

  1. [PowerShell] Lister les membres d'une OU
    Par furth dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/05/2009, 11h49
  2. [VB.NET/SQliteNET]Lister les tables d'une base
    Par PM_calou dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/09/2007, 12h35
  3. [POO] Lister les membres d'une classe
    Par Asmodean dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 12h28
  4. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 23h59

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