Bonjour
Envoyé par
BasicZX81
Si je prends le problème a l'envers je cherche un moyen de passer un paramètre a ma classe qui indiquera à celle-ci quelle procédure elle doit exécuter sans que je fasse référence a cette procédure explicitement a l'intérieur de ma classe puisque celle-ci ne doit pas connaitre a l'avance quelle procédure elle devra exécuter.
Du style :
1 2
| MaClasse.AddTask (MaProcédure, Paramétres)
MaClasse.Start |
Une première approche simple avec action (a plusieurs surcharge) (param non vu)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Class ExecuteMethodeExterne
Private UneMethode As Action
' liste des méthodes qui seront disponibles (identifiant, méthode)
Private DicoMethode As Dictionary(Of String, Action) = New Dictionary(Of String, Action)
Sub AjouteMethode(NomMethode As String, Methode As Action)
DicoMethode.Add(NomMethode, Methode) ' ajoute une méthode et son identifiant
End Sub
' execute la méthode en la retrouvant par son identifiant
Sub Start(NomMethode As String)
UneMethode = DicoMethode(NomMethode) 'appel direct impossible, il faut affecter
UneMethode()
End Sub
End Class |
Utilisation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Private eme As ExecuteMethodeExterne = New ExecuteMethodeExterne
Private Sub frmCode_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
eme.AjouteMethode("trait1", AddressOf traitement1)
eme.AjouteMethode("trait2", AddressOf traitement2)
End Sub
Private Sub btnTraitement1_Click(sender As System.Object, e As System.EventArgs) Handles btnTraitement1.Click
eme.Start("trait1")
End Sub
Private Sub btnTraitement2_Click(sender As System.Object, e As System.EventArgs) Handles btnTraitement2.Click
eme.Start("trait2")
End Sub
Sub traitement1()
MessageBox.Show("Hello ; Traitement N°1")
End Sub
Sub traitement2()
MessageBox.Show("Traitement N°2")
End Sub |
__________________________________
Envoyé par
BasicZX81
Un autre problème lié a cela est que je ne sais pas ranger les paramètres a l’intérieur de ma classe puisque ils sont tous d'un type différent.
Avec une autre approche sans stocker les différentes méthodes mais en les appelant à la volée, pour être le plus souple possible.
Une méthode de la form
1 2 3
| Sub traitement5(Mess As String, mess2 As String)
MessageBox.Show(Mess & mess2)
End Sub |
Dans notre classe, nous définissons l'objet concerné pour l'invoque, nous recherchons la form et la méthode, et nous passons les paramètres
1 2 3 4 5 6
| Class ExecuteMethodeExterne
Sub ExecuteMethodeObjParam(NomForm As String, NomMethode As String, oParam As Object)
Dim f As Object = Type.GetType(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name & "." & NomForm).GetConstructor(Type.EmptyTypes).Invoke(New Object() {})
Type.GetType(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name & "." & NomForm).GetMethod(NomMethode).Invoke(f, oParam)
End Sub |
Appel depuis la form (avec une instance de la classe "ExecuteMethodeExterne" defini ainsi dans la form Private eme As ExecuteMethodeExterne = New ExecuteMethodeExterne)
eme.ExecuteMethodeObjParam(Me.Name, "traitement5", New Object() {"N°5", " 2 param"})
et avec la même méthode de la classe nous pouvons appeler d'autres méthodes de la form qui ont un nombre quelconque de paramètres et qui plus est de types différents (le nombre de paramètre passé devront bien sur correspondre au nombre de param attendu en entrèe et au type)
Une autre méthode de la form
1 2 3
| Sub traitement6(Mess As String, mess2 As String, x As Integer)
MessageBox.Show(Mess & mess2 & x.ToString)
End Sub |
appel
eme.ExecuteMethodeObjParam(Me.Name, "traitement6", New Object() {"N°6 ", " Nb param : ", 3}) ' param de type différent
Note : la form et la classe doit être dans le même assembly (cela peut avoir de l'importance, je bute sur la recherche de la form si elle est dans un assembly différent de la classe)
Espérant que cela t'apporte quelques idées ou un complément d'info.
Partager