Fonction retournant une instance de classe

Résolu
juliengj Messages postés 95 Date d'inscription lundi 11 juin 2007 Statut Membre Dernière intervention 9 mai 2013 - 25 avril 2013 à 16:48
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

3 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
26 avril 2013 à 14:06
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.
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 avril 2013 à 19:28
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
0
juliengj Messages postés 95 Date d'inscription lundi 11 juin 2007 Statut Membre Dernière intervention 9 mai 2013 1
26 avril 2013 à 17:31
Merci beaucoup foliv57 !
C'est ce que je cherchai à faire.
Problème résolut.

Bonne soirée,

Julien
0
Rejoignez-nous