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 :

Débutant en réflexion


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut Débutant en réflexion
    salut tout le monde,

    je me heurte à un problème assez complexe pour moi, je me demande si la réflexion peut m'aider mais malheureusement je n'y connais pas grand chose dans ce domaine...

    Voila mon problème :

    je vient de coder une appli c# (framework 3.5) basé sur environ 60 classes (pr le moment), toutes héritées d'une même classe mère. Dans mon programme principal, j'instancie tour à tour chacune de ces classes filles. après chaque instanciation, j'appelle une méthode statique d'une autre classe, avec en paramètre la classe fille que je vient d'instancier, et qui me renvoie un msg. En gros ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    classeFille task = new classeFille();
    string msg = ClasseTierce.MéthodeStatic(task);
    sauf que pour le moment pour boucler sur chaque classe, je rajoute pour chaque classe fille que je vient de coder ces 2 lignes.

    Ce que je voudrait faire : déclarer, sans instancier, "task" du type de la classe mère, boucler sur chaque classe contenu dans un certain espace de nom (genre donne moi toutes les classes contenues dans "RacineProjet/Tasks/"), caster "task" avec la classe actuellement lue et appeller ma méthode statique...

    je me fait des films ou c'est possible, ou peut-ètre une solution plus simple et meilleure?
    merci de votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var types =
            from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(asm => asm.GetTypes())
            where t.IsSubclassOf(typeof(classeMere))
            select t.FullName;
     
    foreach(Type t in types)
    {
        classeMere task = Activator.CreateInstance(t) as classeMere;
        string msg = ClasseTierce.MéthodeStatic(task);
        Console.WriteLine(msg);
    }

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Mais tes objets task, t'en as besoin ailleurs, ou c'est juste pour appeler ta méthode statique ? Et que fais tu des string renvoyées ?
    Parce que sinon, tu modifies ta méthode statique pour qu'elle prenne un tableau / une liste / un Ienumerable de "ClasseMere", et tu l'appelles avec :
    ClasseTierce.MéthodeStatic(new ClasseMere[] { new Fille1(), new Fille2(), ... });

    La solution de tomlev permet de faire ça automatiquement ceci dit, mais moins j'utilise la réflexion mieux je me porte

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach(Type t in types)
    {
        classeMere task = Activator.CreateInstance(t) as classeMere;
        string msg = ClasseTierce.MéthodeStatic(task);
        Console.WriteLine(msg);
    }
    La requête LINQ ne renvoie pas un IEnumerable<string> plutôt qu'un IEnumerable<Type> ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach(Type t in types)
    {
        classeMere task = Activator.CreateInstance(t) as classeMere;
        string msg = ClasseTierce.MéthodeStatic(task);
        Console.WriteLine(msg);
    }
    La requête LINQ ne renvoie pas un IEnumerable<string> plutôt qu'un IEnumerable<Type> ?
    hum... tu as raison, j'ai fait un copier-coller un peu rapide à partir d'un projet à moi. Il suffit de remplacer
    par

  6. #6
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    oups j'ai loupé pas mal de messages hier, moi

    merci pour toutes vos réponses, ça correspond effectivement à ce que je souhaite, juste 2-3 adaptations à faire.

    Je vous tiendrais au courant si j'ai des problèmes...

    bonne journée

  7. #7
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    OK ça marche, je précise juste pour ceux que ça intéressent qu'il faut utiliser using System.Linq (j'ai bien mis 20 minutes à le comprendre )

    merci bcp

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

Discussions similaires

  1. [Débutant] [C#] Réflexion
    Par dahtah dans le forum C#
    Réponses: 12
    Dernier message: 22/11/2007, 17h31
  2. [débutant] Réflexion sur méthode
    Par dahtah dans le forum Langage
    Réponses: 8
    Dernier message: 02/04/2007, 16h29
  3. [Kylix] Le débutant en Kylix et Linux....
    Par Eclypse dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 10h37
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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