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 confirm�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    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 �m�rite 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
    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 confirm�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    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 �m�rite 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
    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 confirm�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    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 �m�rite 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
    Par d�faut
    Jette un oeil aux tutoriels sur ce site, on y parle de la r�flection.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    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 confirm�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    92
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 92
    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