juliengj
Messages postés95Date d'inscriptionlundi 11 juin 2007StatutMembreDernière intervention 9 mai 2013
-
25 avril 2013 à 16:48
juliengj
Messages postés95Date d'inscriptionlundi 11 juin 2007StatutMembreDerniè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 ?
foliv57
Messages postés420Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention15 juillet 20149 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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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