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

VB.NET Discussion :

instancier une classe à partir de son nom passer comme argument à une fonction


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut instancier une classe à partir de son nom passer comme argument à une fonction
    Bonjour,

    J'ai une variable string "NomClasse" qui passe en paramettre pour une fonction "LaFonction", et je veux pouvoir déclarer dans le corps de cette fonction une classe de type "NomClasse".
    j'ai essayé le code suivant:

    classNorme = procedures(0).ChildNodes(i).Attributes("class").Value
    'classNorme est de type string
    cl = Type.GetType(classNorme)
    Dim ob As Object = cl.InvokeMember("Verify_Name_procedure",System.Reflection.BindingFlags.CreateInstance,Nothing, Nothing, Nothing)

    cela me retourne l'exception:object reference not set to an instance of an object

    Merci

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    C'est un peu normal d'aprés le code, tu essayes de créer une instance de type classNorme à partir d'un constructeur "Verify_Name_procedure" sur ce type ... A mon avis, c'est pas ton but premier ! Comme "Verify_Name_procedure" n'est pas un constructeur ça le fait pas.

    Y'a un bon exemple dans l'aide sur Type.InvokeMember, méthode (String, BindingFlags, Binder, Object, Object[]).

    Remarque personnelle :
    J'utilise plutot que monType.InvokeMember, un AppDomain.CurrentDomain.CreateInstance qui me permet d'instancier des classes sur un assembly différent de celui de la classe d'instanciation.

    Cdt.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    En effet le problème est le suivant: la classe que j'instancie se trouve dans une dll attachée à mon projet (comme une reference). le nom du dll est SQLLib et celui de la classe est Verify_Name_procedure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    cl = Type.GetType("SQLLib.Verify_Name_procedure")
    Dim ob As Object = cl.InvokeMember("Verify_Name_procedure",System.Reflection.BindingFlags.CreateInstance,Nothing, Nothing, Nothing)
    cela me retourne l'exception:object reference not set to an instance of an object

    Merci

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Normal je pense car tu fonctionnes sur un assembly différent de celui qui tente l'instanciation. Il faut donc que tu mettes le "nom complet" de la classe au sein de cette assembly.

    Essayes ça :
    dans ta DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Class Verify_Name_procedure
        Public Function monTest()
            Return "TestOk"
        End Function
    End Class
    dans le projet utilisant cette DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Dim a As New Verify_Name_procedure
            Dim cl As Type = a.GetType
            Dim strAQN As String = cl.AssemblyQualifiedName
            Console.Write(strAQN)
            cl = Type.GetType(strAQN)
            Dim ob As Object = cl.InvokeMember(strAQN, System.Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
            MsgBox(CStr(ob.monTest()))
    Ca marche chez moi et ça va te donner le nom complet du type.

    Donc aprés tu pourras faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim strAQN As String = "Ici le nom complet"
            Dim cl As Type = Type.GetType(strAQN)
            Dim ob As Object = cl.InvokeMember(strAQN, System.Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
            MsgBox(CStr(ob.monTest()))
    Par contre, c'est pourri de mettre tout cela en dur --> si tu changes d'assembly pour la DLL t'es foutu ...

    Faudrait peut être ajouter une petite fonction dans cette DLL qui retourne l'assembly est passer par le CreateInstance...

    Cdt.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci.

  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
    Sur les 10 jours qui viennent de s'écouler, c'est la 3ième question du genre que je lit.

    Ayant répondu à la première, je ne vais pas me répeter, faudrait peut-être apprendre à chercher...

  7. #7
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 777
    Points
    1 777
    Par défaut
    Bonjour.

    Neptune, ne répond que celui qui veux ...

    Et sans te contredire, ce que j'ai lu sur le sujet dans le forum tenait plus du invokemember qu'autre chose, donc avec les limites qu'on connait !

    Mais bon, je ne serai pas formel sur le fait que cela a peut être déjà été traité.

    Y'a pas mort d'homme --> Keep cool !

    Cdt.

Discussions similaires

  1. Instancier une classe sans connaitre son nom
    Par Molkobain dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2009, 14h49
  2. Instancier une classe à partir de son nom?
    Par nabil148911 dans le forum Langage
    Réponses: 5
    Dernier message: 13/01/2009, 02h00
  3. Réponses: 10
    Dernier message: 26/06/2008, 11h25
  4. [IL]Instancier un objet à partir de son nom de classe
    Par neo.51 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/08/2007, 11h43
  5. Réponses: 7
    Dernier message: 29/11/2006, 11h32

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