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 :

Recuperation des classes d'un projet


Sujet :

C#

  1. #1
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut Recuperation des classes d'un projet
    Salut

    est il possible de recuperer dynamiquement la liste des classes d'un projet...

    par exemple toutes les classes herites d'un classe A ...

    thx @+

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Tout ça est possible en c#, et ça s'appel "reflection"
    Voir:
    http://msdn2.microsoft.com/fr-fr/lib...83(VS.80).aspx

    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
    using System;
    using System.Reflection;
     
    class TestReflexion {
      public static void Main() {
        foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies() ) {
          if (asm.GetName().Name != "mscorlib") {
              foreach (Type ty in asm.GetTypes() ) {
              Console.WriteLine("Classe : " + ty);
              foreach (MethodInfo mi in ty.GetMethods() ) {
                Console.WriteLine(" Méthode   : " + mi);
                foreach (ParameterInfo pi in mi.GetParameters() )
                  Console.WriteLine(" Paramètre : " + pi.GetType() );
                }
              }
            }
          }
        }
      }
    (trouver en peu de temps sur le net...)

  3. #3
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Merci

    Est ce egalement possible de recuperer les membres d'une classe a partir de la classe ??

  4. #4
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    surement...

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Seth77
    Merci

    Est ce egalement possible de recuperer les membres d'une classe a partir de la classe ??
    variableInstanceDeClasse.GetType().GetMembers()

    te retourne tout (et plus).

    Tu as de plus des méthodes spécialisées pour les propriétés, les méthodes, les variables membres (GetProperties, GetMethods, GetFields respectivement).

    Chacune de ces méthode possède une signature de base (sans param) qui retourne tout, et une avec un paramètre de Binding permettant de restreindre le retour (Public, static, etc ...).

    Attention : il semble y avoir quelques bugs avec ce paramètre (par exemple un GetFields avec le BindingFlags.Public ne fonctionne pas sur les fields statiques, pour une raison que j'ignore).

  6. #6
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par Bluedeep
    variableInstanceDeClasse.GetType().GetMembers()

    te retourne tout (et plus).

    Tu as de plus des méthodes spécialisées pour les propriétés, les méthodes, les variables membres (GetProperties, GetMethods, GetFields respectivement).

    Chacune de ces méthode possède une signature de base (sans param) qui retourne tout, et une avec un paramètre de Binding permettant de restreindre le retour (Public, static, etc ...).

    Attention : il semble y avoir quelques bugs avec ce paramètre (par exemple un GetFields avec le BindingFlags.Public ne fonctionne pas sur les fields statiques, pour une raison que j'ignore).
    Slu

    voila ce que j'essaye :

    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
     
    class Class1_member
        {
            public int i1;
            private bool b1;
            private bool b2;
     
            public Class1_member()
            {
     
                i1 = 12;
                b1 = true;
                b2 = false;
     
                this.GetType().GetFields(BindingFlags.NonPublic);        (1)
                this.GetType().GetFields();                         (2)
            }
        }
    Et pourtant je ne recupere avec 1 rien et avec 2 juste i1 ....
    Comment faire pour recuperer i1, b1 et b2 ?


  7. #7
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Salut

    Est ce que c'est completement faux ou alors personne ne comprends commme moi ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Voici un exemple qui fonctionne:
    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
    namespace EssaiGetFields
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test t = new Test();
     
                foreach (FieldInfo fi in t.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
                {
                    Console.WriteLine(fi.Name);
                }
            }
        }
     
        class Test
        {
            public int i1 = 0;
            private bool b1 = false;
            internal double d1 = 0;
            protected decimal d2 = 0;
        }
    }

  9. #9
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par NicolasJolet
    Voici un exemple qui fonctionne:
    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
    namespace EssaiGetFields
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test t = new Test();
     
                foreach (FieldInfo fi in t.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
                {
                    Console.WriteLine(fi.Name);
                }
            }
        }
     
        class Test
        {
            public int i1 = 0;
            private bool b1 = false;
            internal double d1 = 0;
            protected decimal d2 = 0;
        }
    }

    Merci ..ca marche ... il manquait le "BindingFlags.Instance" pour tout avoir

    J'ai un autre probleme ; je passe une classe a une fonction et je verifie les membres en fonction de leurs hierarchies ... pourtant les classes sont bien derive de la classe DB_Access.DB_Field mais il ne rentre jamais dans le if ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach (FieldInfo aFieldInfo in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
    {
       if (aFieldInfo.FieldType.GetType().IsSubclassOf(Type.GetType("DB_Access.DB_Field")))
       {                    
          int i = 3;
       }
    }

  10. #10
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach (FieldInfo aFieldInfo in LaClasse.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
    {
       if (aFieldInfo.FieldType.GetType().IsSubclassOf(Type.GetType("DB_Access.DB_Field")))
       {                    
          int i = 3;
       }
    }
    Petite erreur : Je recupere la classe "LaClasse" pour prendre toutes les variables et pour ensuite en ressortir celles qui sont derive de DB_Field....mais cela ne marche pas ....

    Pourtant dans une fenetre espion je vois bien les bons objets et le fait qu'ils soit derives de DB_Field ....

    Dans mes test j'ai meme 2 objets qui en derivent et 1 non ... et aucun ne rentre dans le if

  11. #11
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Salut

    j'ai reussit ... cela marche un peu mieux avec un typeof ... etrange tout de meme juste avant avec le GetType cela marchait !



    Sinon maintenant j'ai un autre probleme ...



    Je n'arrive pas a recuperer a partir de aFieldInfo mon objet de type DB_Access.DB_Field ..... j'ai regarder dans la MSDN et je fais pareil ... toujours NULL dans mon objet, ou alors une Exception a cause de qqchose de static !



    Comment faire ?

    Merci d'avance !

Discussions similaires

  1. [Eclipse 3.4.1] comparer des classes de 2 projets
    Par stigmate101 dans le forum Eclipse
    Réponses: 2
    Dernier message: 30/03/2009, 18h39
  2. Intégrer des classes d'autre projets dans son JAR
    Par romaintaz dans le forum Maven
    Réponses: 7
    Dernier message: 20/02/2008, 12h02
  3. [Débutant] inclure des .class dans le projet
    Par chadliii dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 16/02/2007, 00h01
  4. Récupérer des classes d'un projet MDI
    Par MoscoBlade dans le forum MFC
    Réponses: 2
    Dernier message: 10/12/2006, 16h25
  5. Réponses: 3
    Dernier message: 05/07/2006, 11h59

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