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 :

Typage dynamique à partir d'un string


Sujet :

C#

  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut Typage dynamique à partir d'un string
    Salut,

    mon problème est le suivant : je me trouve avec un string contenant le nom d'une classe. J'aimerai pouvoir récupéré le Type de cette classe afin de l'instancier. Comment procéder ?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Euh, la classe existe déjà ou non ?

    Tu veux instancié un objet de type : la classe contenue dans la string ?
    ou tu veux créer une classe carrément ?

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Je ne veux pas que la classe soit instancié de façon explicite, en dur dans le code. Je veux me donner la possibilité d'instancier un objet d'une classe dont le nom est seulement passé dans un string.
    Et si possible je ne veux pas que la classe qui va permettre l'instanciation connaisse autre chose qu'un interface implémentée par la classe dont on connait juste le nom dans le string. Les classes (instanciante et instanciée) font partie du même namespace cependant.

    Suis-je clair ?

  4. #4
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Je vois, mais quel est le but ?

    Avec une interface ou une classe abstraite cela n'irait pas ?

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Petite précision : un wrapper avec une table de correspondance nom-classe ne me conviendrait pas spécialement, ça serait vraiment ma "solution de sauvetage" faute de mieux ...


  6. #6
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Peut-être avec des classes génériques, y as-tu pensé ?

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Je ne sais pas trop, désolé je suis nouveau en C#

    J'aimerai faire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string type = node.Current.Value;
    ...
    Type classe =  Type.GetType(type);
    classe mod = new classe(...);
    je ne sais pas si c'est plus clair ?

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Tu peux le faire avec Assembly.CreateInstance( nom du type)

  9. #9
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    En recherchant j'ai réussi à adapter un peu un exemple de la FAQ que je n'avais pas trop saisi en premier lieu.
    J'ai modifié mon code pour arriver à celui qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string type = node.Current.Value;
    ...
    Type classe =  Type.GetType(type);
    object obj = System.Activator.CreateInstance(classe, ...);
    IModule mod = obj as IModule;
    sachant que le type classe implémente IModule.

    Est-ce que ça va bien me donner ce que j'espère ?

  10. #10
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par matdur Voir le message
    Tu peux le faire avec Assembly.CreateInstance( nom du type)
    je ne sais pas si ça revient exactement à ce que j'ai proposé au-dessus, mais le pb reste le même : je ne veux pas faire apparaitre le type "final" de façon explicite => de quel type doit être l'objet ou la référence sur le résultat de Assembly.CreateInstance( nom du type) (pour suivre ton exemple)?

  11. #11
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Si l'on en croit l'article C#4 : un typage dynamique des objets de Didier Girard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dynamic calc = GetCalculator();
    int sum = calc.Add(10, 20);
    Invocation, d'une méthode Add en utilisant le typage dynamique de C# 4. La résolution de type, le fait que "10" et "20" sont des entiers se fera à l'exécution
    Je pense donc que le dernier code que j'avais mis marchera correctement.

    Si quelqu'un a quelque chose à dire n'hésitez pas , toute remarque est la bienvenue

  12. #12
    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
    dynamic est un mot clé rajouté par C#4.

    Pour ton problème précis, c'est bien Activator.CreateInstance qu'il faut utiliser. Ce code :n'est pas concevable en .Net parce que "classe" n'est pas connu de façon statique, à la compilation. C'est pour ça que Activator.CreateInstance renvoie un object.

    Que veux tu faire de l'objet, une fois qu'il est créé ?

  13. #13
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    L'objet une fois instancié servira à traiter des jobs :
    - il peut réimplémenter des méthodes de IModule pour sa gestion interne
    - il dispose de fonctions qui implémente la signature
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void Run(ref Message mess);
    afin de réaliser les jobs

    Ça parait réalisable ?

  14. #14
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    D'ailleurs à ce propos, si j'ai défini un fonction, "implémentant" Run,comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void Traitement1(ref Message mess){...}
    Comment l'appeler sachant que je dispose de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string nomfonction = "Traitement1";
    C'est en fait le même problème que précédemment, mais avec un nom de fonction au lieu d'un nom de classe. et dans ce dernier cas je n'ai pas à me soucier de l'instanciation : on suppose que l'objet d'où provient la méthode est déjà créé en mémoire.

    Merci d'avance

  15. #15
    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
    Fouille la doc du namespace System.Reflection. Par exemple, pour exécuter une méthode à partir de son nom, il y a un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MethodInfo m = typeof(MonType).GetMethod("Run");
    m.Invoke(new object[] {paramètre1, paramètre2});
    C'est approximatif, mais tu vois l'idée

  16. #16
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Oui j'ai trouvé ça aussi, mais ça ne répond pas à mes attentes.

    Je ne veux pas recompiler du code à la volée, mais je veux appeler dynamiquement la méthode d'une classe que je sais instanciée (ce qui n'est pas le cas de la méthode que tu proposes, enfin il me semble). Du côté de System.Reflection je n'ai rien trouvé pour faire ça, j'ai donc opté pour un tableau de correspondance dans le classe, qui contient la méthode que je souhaite appeler, afin de faire la relation entre une référence à cette méthode et le string qui contient son nom (ou ce qu'on veut d'ailleurs).

    En tout cas merci pour ton aide, et n'hésite pas à me corriger si je dis des conneries

  17. #17
    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
    C'est peut être ça que tu cherche ?

    http://msdn.microsoft.com/fr-fr/library/66btctbe.aspx

  18. #18
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Merci c'est ce que je cherchais, je le garde sous le coude pour comparer avec ma méthode avec tableau.


  19. #19
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'ai un petit soucis avec Type. GetType ...

    En effet j'ai un classe comme ceci :
    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
    namespace Projet
    {
       public class A 
       {
     
           ...
     
           static void Main(string[] args)
           {
     
           ...
     
             string type = "A";
             Type classe = Type.GetType(type);
     
           ...
     
          }
       }
    }
    Type.GetType me renvoie systématiquement null ...

    Quelqu'un voit d'où pourrait venir mon problème svp ?


    PS : si je précise le namespace je n'ai pas d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string type = "Projet.A";
    cependant je ne comprends pas pourquoi je devrai le préciser vu que le Main appartient à un classe faisant partie de ce namespace.

  20. #20
    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
    Parce que quand la méthode Type.GetType est exécutée, il n'y a pas de "contexte" indiquant qu'on se "trouverait" dans le namespace TrucMuche.Bidule.

    T'imagine le bordel si une méthode se comportait différemment selon l'endroit d'où elle est appelée ?

    Un namespace, ce n'est qu'un préfixe au nom des objets. C'est tout.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Création dynamique control à partir d'une string
    Par J@ckHerror dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/03/2007, 05h22
  2. [Info]Créer un tableau de String à partir d'autres String
    Par Nasky dans le forum Collection et Stream
    Réponses: 21
    Dernier message: 06/07/2005, 11h46
  3. Récupérer des floats à partir d'une string
    Par hamster dans le forum SL & STL
    Réponses: 8
    Dernier message: 09/06/2005, 08h10
  4. [DOM] Comment creer un DOM à partir d une String
    Par RolandB dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 24/04/2005, 18h11
  5. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 12h12

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