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 :

Appel d'une instance de classe par le nom de cette dernière [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut Appel d'une instance de classe par le nom de cette dernière
    Bonjour Madame, Monsieur.

    Je voudrais savoir si, en Vb 2010 Express, il est possible de créer une fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Instance(NomClasse As String) As Object
    Merci d'avance.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si c'est pour créer une instance elle existe déjà ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Activator.CreateInstance()
    si c'est pour du référencement d'instance il te faut un collections.generic.dictionary(of string, object)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour Pol63.

    J'ai rédigé la fonction suivante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Public Function Instance(ByVal NomClasse As String) As Object
            Dim Obj As Runtime.Remoting.ObjectHandle
            Obj = CreateInstance(Nothing, NomClasse)
            Obj.Unwrap()
            Return Obj.Unwrap()
        End Function
    compte tenu de la documentation qui affirme que
    Si assemblyName est référencé Nothing, la recherche s'effectue dans l'assembly en cours d'exécution.
    J'ai appelé cette fonction avec "Capitaine" pour l'argument NomClasse, sachant que mon programme contient une classe ainsi nommée. Il en a résulté le message d'erreur
    Impossible de charger le type 'Capitaine' à partir de l'assembly 'Investigation06, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
    Serait-ce que la procédure CreateInstance ne fonctionne pas pour les classes personnelles ?

    Merci de bien vouloir me répondre.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Bonjour Pol63.

    J'ai rédigé la fonction suivante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Public Function Instance(ByVal NomClasse As String) As Object
            Dim Obj As Runtime.Remoting.ObjectHandle
            Obj = CreateInstance(Nothing, NomClasse)
            Obj.Unwrap()
            Return Obj.Unwrap()
        End Function
    compte tenu de la documentation qui affirme que

    J'ai appelé cette fonction avec "Capitaine" pour l'argument NomClasse, sachant que mon programme contient une classe ainsi nommée. Il en a résulté le message d'erreur

    Serait-ce que la procédure CreateInstance ne fonctionne pas pour les classes personnelles ?

    Merci de bien vouloir me répondre.
    Regarde du coté des classes (membres) static et des design patterns factory et singleton
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  5. #5
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour BenoitM.

    Je vois mal le lien entre ma question (qui appelle me semble-t-il une réponse par oui ou par non) et votre réponse.

    Quoiqu'il en soit, je vous remercie de m'avoir répondu.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Serait-ce que la procédure CreateInstance ne fonctionne pas pour les classes personnelles ?
    Non

  7. #7
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour Nathanael Marchand

    J'ai eu le tort de poser ma question de façon négative. Il peut en résulter une ambiguïté. En effet, à strictement parler, votre réponse "non" signifie qu'il est faux de dire que la procédure CreateInstance ne fonctionne pas pour les classes personnelles, et donc qu'il reste un espoir que l'erreur se trouve ailleurs. Si c'était le cas, voudriez-vous me proposer une correction ?

    Merci d'avance.

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Bonjour Nathanael Marchand

    J'ai eu le tort de poser ma question de façon négative. Il peut en résulter une ambiguïté. En effet, à strictement parler, votre réponse "non" signifie qu'il est faux de dire que la procédure CreateInstance ne fonctionne pas pour les classes personnelles, et donc qu'il reste un espoir que l'erreur se trouve ailleurs. Si c'était le cas, voudriez-vous me proposer une correction ?

    Merci d'avance.
    En effet, c'est le cas mais comme dans le message du dessus tu as indiqué que tu voulais qu'un oui ou un non, j'ai respecté la consigne

    Plus sérieusement, le nom d'une classe tel que tu en as besoin n'est pas que le nom tel que tu l'as déclaré dans ton code, il y a également le namespace qui entre en jeu. Par exemple, pour la classe String, c'est System.String qu'il faut.

    Néanmoins, je suis assez d'accord avec BenoitM. Pourquoi arriver à ce genre de "bidouilles" ? Il existe peut être une solution plus élégante à ton problème?

  9. #9
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Merci pour le tuyau. Par ailleurs, je suis d'accord pour dire que cela sent la bidouille. Et en ce qui concerne une solution plus élégante, j'ai commencé à chercher par une autre voie.

    Merci de m'avoir répondu.

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Et en ce qui concerne une solution plus élégante, j'ai commencé à chercher par une autre voie.
    Ben si t'exposes ton problème on doit peut être pouvoir t'aider

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Serait-ce que la procédure CreateInstance ne fonctionne pas pour les classes personnelles ?
    il n'y a pas de classes personnelles, il y a des classes dans des assemblies
    le framework est codé en .net donc toutes les classes étaient à un moment données des classes "personnelles" des développeurs microsoft ^^

    il existe par ailleurs des moyens de chercher des classes dans tous les assemblies (enfin de chercher des types)

    après au lieu de nous demander comment faire tu ferais mieux de nous dire pourquoi tu veux faire, on pourras alors mieux te répondre ou t'aiguiller vers une solution plus adaptée s'il y en a une ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Mon problème est de n'en pas avoir. Il ne me reste que des cahiers des charges que je me donne, suffisamment tordus pour qu'ils soient difficiles à traiter. Je suis un ancien de VB6. Retraite venue, j'ai continué à programmer pour m'amuser. Puis, récemment, j'ai appris (à 72 ans) que Visual Basic avait viré sa cuti. J'ai voulu savoir, ce qui de fil en aiguille m'a conduit à télécharger vb 2010 Express, puis de m'abonner à ce forum.
    Alors d'une part, j'ai bien le droit d'y poster des questions et même des réponses. Mais d'autre part, j'ai scrupules à mobiliser des experts comme vous uniquement pour satisfaire ma curiosité.

    Avec toute ma sympathie.

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    quand je dis qu'il vaut mieux exposer le problème c'est qu'il y a des débutants bornés et équipés d’œillères qui devraient le faire, on y gagnerait tous du temps ^^

    Citation Envoyé par Jean-Marie Grave Voir le message
    Alors d'une part, j'ai bien le droit d'y poster des questions et même des réponses. Mais d'autre part, j'ai scrupules à mobiliser des experts comme vous uniquement pour satisfaire ma curiosité.
    pas de soucis alors, la curiosité a sa place ici aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Très bien. J'admire. C'est si rare.

    Or donc, je vous décris dans les grandes lignes le cahier des charges bizarroïde sur lequel je joue en ce moment.

    D'abord l'entrée en matière. J'ai rédigé un programme structuré hiérarchiquement, grâce à cinq classes que j'ai nommées selon le vocabulaire militaire, puisqu'il s'agit de hiérarchie
    1) Une classe Capitaine possédant quelques propriétés de types simples, mais surtout une propriété de type Adjudants.
    2) Une classe Adjudants représentant une collection d'objets de classe Adjudant.
    3) Une classe Adjudant possédant quelques propriétés de types simples, mais surtout une propriété de type Bidasses.
    4) Une classe Bidasses représentant une collection d'objets de classe Bidasse.
    5) Une classe Bidasse possédant quelques propriétés de types simples.
    Cela permet de construire un objet
    qu'il s'agit de savoir sauvegarder et recharger.
    C'est ici que l'aspect bizarroïde apparaît. Je cherche à sauvegarder Cap non pas par sérialisation, mais par un nouveau procédé que je nomme "textualisation", avec une pointe d'ironie. Il s'agit de produire un fichier texte, qui décrit explicitement toute la structure hiérarchique dont Cap est la tête, en utilisant pour cela des indentations, comme dans l'explorateur de Windows. Ce n'est pas très difficile. J'ai mis dans chaque classe une procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function Textualisé(ByVal n As Integer) As String
    dans laquelle n est le niveau d'indentation, et qui pour toute classe autre que Bidasse appelle la fonction Textualisé du niveau hiérarchique inférieur. Cela fait en sorte que le String mettre dans le fichier est
    Il me reste maintenant à "détextualiser" le contenu du fichier. Vous comprenez alors mon intérêt pour un éventuelle procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Instance(ByVal NomClasse As String) As Object
    Mais on doit pouvoir s'en passer. Toute suggestion autre qu'une modification du cahier des charges sera la bienvenue.

    Cordialement.

  15. #15
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    En effet, je n'aurai pas fonctionné comme ceci. Dejà, je ne vois pas trop l'interet de faire les 5 classes. Une suffit avec une propriété qui indique le grade (mais bon, selon les besoins, la modelisation peut changer). Ensuite, inutile de créer des classes Adjudants et Bidasses, il existe des conteneurs génériques comme un List(of Adjudant) qui permet de stocker une liste d'objets Adjudant. Enfin, pour la sérialisation, .Net permet "out of the box" la sérialisation binaire, XML et JSON. C'est dommage de s'en passer

  16. #16
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Pour l'instant je ferai Nathanael Marchand
    Une classe Soldat avec un Enum Grade qui peut prendre les différentes valeur
    Apres si tu as besoin de comportement plus spécifique faire une classe dérivé de Soldat (exemple général) et tu ajoutes un check sur l'initiation de la propriété Grade
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  17. #17
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Désolé.

    J'ai été très bête de poser la question initiale comme si je demandais une fonction universelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Instance(ByVal NomClasse As String) As Object
    alors qu'une fonction spécifique à un programme me suffit. Dans le cas de l'exemple que je traite, je peux donc me borner à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function  Instance(ByVal NomClasse As String) As Object
        Dim Obj As Object
            Select Case NomClasse
                Case "Bidasse" : Obj = New Bidasse
                Case "Bidasses" : Obj = New Bidasses
                Case "Adjudant" : Obj = New Adjudant
                Case "Adjudants" : Obj = New Adjudant
                Case "Capitaine" : Obj = New Capitaine
                Case Else
            End Select
        Return Obj
    End Function
    Mes excuses à tous pour m'avoir fait perdre votre temps.

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

Discussions similaires

  1. Appel d'une methode de classe par message inopérant dans une dll
    Par Jacques Deyrieux dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/08/2010, 08h10
  2. Réponses: 4
    Dernier message: 03/05/2008, 09h56
  3. Retrouver une instance de classe par son nom
    Par chipster45 dans le forum Langage
    Réponses: 15
    Dernier message: 10/03/2008, 19h26
  4. Réponses: 2
    Dernier message: 08/06/2007, 11h21
  5. Réponses: 10
    Dernier message: 10/12/2006, 16h26

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