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 :

Instancier une class a partire d'une variable string


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 56
    Points
    56
    Par défaut Instancier une class a partire d'une variable string
    Bon, javais déjà parlé de ce problème ici, mais je bloque sur l'utilisation de Activator.CreateInstance qui m'avait été proposé.

    Voilà le problème :

    imaginon que j'ai une variable de type string qui contien "coucou"


    Pour commencer, je veux tester si class nomé coucou existe.

    Apres, si cette classe existe, je veux l'instancier en lui passant des paramètres.

    Comment faire ?

    Premièrement, avec Activator.CreateInstance, je ne voix pas comment passer les paramètres

    ensuite, je n'arrive pas à utiliser cette fonction, car j'ai beau dépouiller la documentation, je ne comprend ni les instruction d'utilisation, ni les messages d'erreurs...

    Suis-je sur la bonne voie ?

    Comment déterminer le nom d'Assembly de mon site web .net ?

    Quelqu'un pourrait-il me proposer un bout de code exemple ?

    Y aurrai-t-il d'autre solution à ce probleme ?

    Et pour finir, ça n'a rien à voir, mais quel est la diférence entre string et String qui se comportent exactement de la même manière, mais qui ont des colorisations syntaxiques diférentes ?

    Je remercie d'avance les gourous qui sauront répondre à toutes mes interrogations ^^

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Type type = Type.GetType("System.String"); // Création d'un type à partir d'une string
    object[] arguments = new object[1]; // Création d'un tableau d'un seul argument
    arguments[0] = "Neptune".ToCharArray(); // Affectation de l'argument (le constructeur de string accepte un tableau de caractères)
     
    object obj = type.InvokeMember(null, BindingFlags.DeclaredOnly |
    BindingFlags.Public | BindingFlags.NonPublic |
    BindingFlags.Instance | BindingFlags.CreateInstance, null, null, arguments); // Affection à obj du résultat de l'appel d'InvokeMember (voir doc pour les paramètres)
     
    Console.WriteLine("Type: " + obj.GetType().ToString()); // Vérification du type de l'objet créé
    Console.WriteLine("{0}", obj); // vérification de son contenu

    string et String c'est pareil, string n'est qu'un alias de String. Idem pour int = Int32, long = Int64,...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 56
    Points
    56
    Par défaut
    Pfiou, c'est du lourd !

    J'ai du mal à comprendre tout ce qu'il se passe.

    Bon, voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Type typeClass = Type.GetType(chaineQuiContienLeNomDeLaClass);
     
    Object[] arguments = new Object[2];
     
    arguments[0] = variableTypeDictionary;
    arguments[1] = variableTypeXmlNodeList;
     
    Object obj = typeClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, arguments);
     
    // Normalement, la classe appele contien une variable string
    // qui s'appelle retourModule
    LiteraSortie.Text = obj.retourModule;
    Mais là, pas moyen de récupérer ma variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CS1061: 'object' ne contient pas une définition pour 'retourModule' et aucune méthode d'extension 'retourModule' acceptant un premier argument de type 'object' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)
    Y'a un truc qui m'échappe, mais je ne voie pas trop dans quel direction chercher...

    Merci encore pour ton aide ^^

  4. #4
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Oui, c'est lourd, mais tu fait de la réflection, c'est normal qu'il faut donner autant de paramètres pour aider le runtime à créer ce que tu lui demande.

    Il est normal que tu obtiennes cette erreur. Le type de obj est object, et object ne contient pas de propriété "retourModule". Même si tu as créer le bon type auquel tu t'attend.

    Si tu veux accéder à "retourModule", tu devras encore une fois utliser InvokeMember.

    J'ai cru comprendre que tu débutes en .NET et te voir déjà faire de la réflection me fait méchament penser que tu t'y prend très mal pour atteindre ton but.

    Si tu nous disais ce que tu essaie de faire exactement?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 56
    Points
    56
    Par défaut
    Oui, je débute.

    Mais bon, pour ce qui est de la réflexion, pourrais tu me donner quelques ressources, que je voi à quoi ça correspond ?

    Ensuite, j'ai un autre probleme :
    Quand je commente la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //LiteraSortie.Text = obj.retourModule;
    Je me retrouve avec l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.
    Sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object obj = typeClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, arguments);
    A quoi ça peut être du ?

    Bon, sinon, pour revenir à ta question, pour l'instant, je cherche à apprendre à faire certaine choses. Je n'ai pas un but précis.

    Là, je veux savoir comment instancier et acceder à une class avec un nom identique au contenu d'une string apres avoir vérifier que la class en question existe.

    Meric pour ton aide ^^

  6. #6
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Jette un oeil aux tutoriels sur ce site, on y parle de la réflection.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 56
    Points
    56
    Par défaut
    Popopoooo

    Je vien de parcourire ce tuto :
    http://emerica.developpez.com/dotnet...uction/csharp/

    C'est vraiment bien fait, et je vais le décortiquer, mais je pense que je n'ai pas encore le niveau pour bien comprendre...

    En attendant, j'aimerais juste réussire à faire ce que je veux faire. Avoire du code qui marche par rapport à quelquechose que je veux faire m'aide toujours bien à comprendre.

    Bon, pour le probleme de type dont tu m'a parlé, j'ai tenté le truc suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Convert.ChangeType(obj, typeClass);
    Mais j'ai toujours la même erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CS1061: 'object' ne contient pas une définition pour 'retourModule' et aucune méthode d'extension 'retourModule' acceptant un premier argument de type 'object' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)
    Et de toute façon, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object obj = typeClass.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, arguments);
    génère toujours l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    Points : 56
    Points
    56
    Par défaut
    Ayé, je m'en suis sorti, et en plus, je croi avoir bien compris le principe du truc dans son ensemble !

    Je vous expose ma solution pour que vous puissiez me dire si vous pensez qu'elle n'est pas bonne ou qu'elle nécécite quelques ajustement (sécurité, fiabilité...)

    Sachant que le but de cette manip était de pouvoire utiliser des sorte de module externe que j'aurais programmé, j'ai fait des modules en DLL directement en C# dans lesquelle je metais mes classes.

    Bon, pour commencer, j'avais laissé tomber la réflexion que ne me semblais pas vraiment correspondre à ce que je voulais faire, à savoire, instancier une class avec une string.

    Je me suis donc réorienté vers le premier conseil que j'avais eu sur le sujet, à s'avoir, l'utilisation de Activator.CreateInstance(String, String).

    Ensuit, le probleme est que je ne pouvais Unwraper mon instance que dans un objet de type Object, puique le type était dans une string, alors c'était génant.

    A partire de là, j'ai repensé à la Réflexion, et je l'ai utilisé pour contourné ce probleme. Voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
            System.Runtime.Remoting.ObjectHandle moduleHandle = Activator.CreateInstance("leNamespaceDuModule", String.Concat("leNamespaceDuModule", ".module"));
     
     
            Type typeClass = moduleHandle.Unwrap().GetType();
            Object moduleContenu = (Object)moduleHandle.Unwrap();
     
            Object[] arguments = new Object[2];
     
            arguments[0] = variableDictionary;
            arguments[1] = variableXnl;
     
            LiteralContenu.Text = (String)moduleContenu.GetType().InvokeMember("retourModule", BindingFlags.InvokeMethod, null, moduleContenu, arguments);
    Et voilà !

    Au final, ça semble marcher du toner, donc merci vraiment à tout ceux qui m'ont donné toute les piste et les ressources nécéssaire pour que je puisse m'en sortire.

    Maintenant, n'hésitez pas à me dire ce que vous pensez de mon code...

    Merci beaucoup !

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

Discussions similaires

  1. Instance d'une classe fille à partir d'une classe mère
    Par Mathieu Salles dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/10/2012, 16h09
  2. Message sur une form a partir d'une class
    Par topolino dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/06/2009, 08h57
  3. instanciation d'une classe a partir d'une jComboBox
    Par adrien1 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 30/03/2009, 11h43
  4. Réponses: 1
    Dernier message: 18/03/2008, 15h29
  5. Générer une classe java à partir d'une autre
    Par hebmaster dans le forum Général Java
    Réponses: 5
    Dernier message: 29/05/2006, 16h09

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