Fonction retournant une instance de classe [Résolu]

Messages postés
95
Date d'inscription
lundi 11 juin 2007
Statut
Membre
Dernière intervention
9 mai 2013
- - Dernière réponse : juliengj
Messages postés
95
Date d'inscription
lundi 11 juin 2007
Statut
Membre
Dernière intervention
9 mai 2013
- 26 avril 2013 à 17:31
Bonjour à tous,

J'ai plusieurs classes et je voudrais avoir une fonction qui me retourne une instance de l'une de ces classes suivant son identifiant.

Voilà un bout de code expliquant ce que je voudrai faire.
' Les classes doive être dans un fichier séparer (Class1.vb; Class2.vb etc...)
Imports System.Reflection

Public Class Class1
    Public ID As UInteger = 52

    Public Sub InitClass()
        'Instruction propre à Class1...
    End Sub
End Class

Public Class Class2
    Public ID As UInteger = 24

    Public Sub InitClass()
        'Instruction propre à Class2...
    End Sub
End Class

Public Class Class3
    Public ID As UInteger = 12

    Public Sub InitClass()
        'Instruction propre à Class3...
    End Sub
End Class


Public Class Main
    Sub New()
        Dim ObjectClass As Object = GetClass(36)
        If ObjectClass Is Nothing Then Exit Sub

        ObjectClass.InitClass()
    End Sub

    'Récupère le Type de la classe correspondant à l'id.
    Public Function GetClass(ByVal CurrentId As Integer) As Object
        Dim myAssembly As Assembly = Assembly.GetAssembly(GetType(Main))
        For Each myType As Type In myAssembly.GetTypes()
            Try
                Dim field As FieldInfo = myType.GetField("ID")
                If field IsNot Nothing Then
                    Dim id As Short = CShort(field.GetValue(myType))
                    If id = CurrentId Then

                        Return Activator.CreateInstance(myType)
                    End If

                End If
            Catch
            End Try
        Next
        Return Nothing
    End Function

End Class


Ma fonction trouve bien la classe correspondant à "CurrentId" mais la suite ne va pas. Comment puis-je faire cela ?

Merci par avance,
Bonne après-midi.

Julien
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
4
3
Merci
Bonjour à tous,

Et pour la partie initialisation de la classe trouvée, il vous faut créer une interface.

L'interface permet définir des propriétés, fonctions, modules ... communs à plusieurs classes.

Voici l'exemple
Public Interface IInitialisable

    Sub InitClass()

End Interface

Public Class Class1
    Implements IInitialisable

    Public ID As UInteger = 52

    Public Sub InitClass() Implements IInitialisable.InitClass
        'Instruction propre à Class1...
    End Sub

End Class

Sub Main()
    Dim ObjectClass As Object = GetClass(36)
    If ObjectClass Is Nothing Then Exit Sub
    Dim iObjectClass As IInitialisable = CType(ObjectClass, IInitialisable)

    iObjectClass.InitClass()
End Sub


Il suffit donc de définir dans l'interface toutes les fonctions communes et d'implémenter l'interface pour chacune de vos classes. Une fois l'objet converti (Dim iObjectClass As IInitialisable = CType(ObjectClass, IInitialisable)), vous pourrez appeler ces fonctions sur l'objet.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Commenter la réponse de foliv57
Messages postés
14567
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 octobre 2019
136
0
Merci
Bonjour,

Pour ta déclaration, c'est pas facile, car tu as déclaré le champ en tant que attribut (variable) d'instance.

Sinon, pour ton objectif, utiliser Reflection est bien, mais utilises plutot un attribut de classe pour filtrer :
<MonAttribut(16)> Public Class MaClasse

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Commenter la réponse de NHenry
Messages postés
95
Date d'inscription
lundi 11 juin 2007
Statut
Membre
Dernière intervention
9 mai 2013
0
Merci
Merci beaucoup foliv57 !
C'est ce que je cherchai à faire.
Problème résolut.

Bonne soirée,

Julien
Commenter la réponse de juliengj