Appel d'une propriété ou méthode à l'aide d'un nom de chaîne (Visual Basic)
Dans la plupart des cas, vous pouvez découvrir les propriétés et les méthodes d’un objet au moment de la conception, et écrire du code pour les gérer. Toutefois, dans certains cas, il se peut que vous ne connaissiez pas les propriétés et méthodes d’un objet à l’avance, ou que vous souhaitiez simplement permettre à un utilisateur final de spécifier des propriétés ou d’exécuter des méthodes au moment de l’exécution.
Fonction CallByName
Prenons l’exemple d’une application cliente qui évalue les expressions entrées par l’utilisateur en passant un opérateur à un composant COM. Supposons que vous ajoutez constamment de nouvelles fonctions au composant qui nécessitent de nouveaux opérateurs. Lorsque vous utilisez des techniques d’accès aux objets standard, vous devez recompiler et redistribuer l’application cliente avant qu’elle puisse utiliser les nouveaux opérateurs. Pour éviter cela, vous pouvez utiliser la fonction CallByName
pour passer les nouveaux opérateurs en tant que chaînes, sans modifier l’application.
La fonction CallByName
vous permet d’utiliser une chaîne pour spécifier une propriété ou une méthode au moment de l’exécution. La signature de la fonction CallByName
se présente comme suit :
Result = CallByName
(Object, ProcedureName, CallType, Arguments())
Le premier argument, Object, prend le nom de l’objet sur lequel vous souhaitez agir. L’argument ProcedureName prend une chaîne qui contient le nom de la méthode ou de la procédure de propriété à appeler. L’argument CallType prend une constante qui représente le type de procédure à appeler : une méthode (Microsoft.VisualBasic.CallType.Method
), une propriété lue (Microsoft.VisualBasic.CallType.Get
) ou un jeu de propriétés (Microsoft.VisualBasic.CallType.Set
). L’argument Arguments, qui est facultatif, représente un tableau de type Object
qui contient tous les arguments de la procédure.
Vous pouvez utiliser CallByName
avec des classes dans votre solution actuelle, mais il est le plus souvent utilisé pour accéder à des objets COM ou des objets à partir d’assemblys .NET Framework.
Supposons que vous ajoutez une référence à un assembly qui contient une classe nommée MathClass
, qui a une nouvelle fonction nommée SquareRoot
, comme indiqué dans le code suivant :
Class MathClass
Function SquareRoot(ByVal X As Double) As Double
Return Math.Sqrt(X)
End Function
Function InverseSine(ByVal X As Double) As Double
Return Math.Atan(X / Math.Sqrt(-X * X + 1))
End Function
Function Acos(ByVal X As Double) As Double
Return Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
End Function
End Class
Votre application peut utiliser des contrôles de zone de texte pour contrôler la méthode à appeler et ses arguments. Par exemple, si TextBox1
contient l’expression à évaluer et TextBox2
est utilisé pour entrer le nom de la fonction, vous pouvez utiliser le code suivant pour appeler la fonction SquareRoot
sur l’expression dans TextBox1
:
Private Sub CallMath()
Dim Math As New MathClass
Me.TextBox1.Text = CStr(CallByName(Math, Me.TextBox2.Text,
Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub
Si vous saisissez « 64 » dans TextBox1
, « SquareRoot » dans TextBox2
, puis appelez la procédure CallMath
, la racine carrée du nombre dans TextBox1
est évaluée. Le code de l’exemple appelle la fonction SquareRoot
(qui prend une chaîne qui contient l’expression à évaluer en tant qu’argument requis) et retourne « 8 » dans TextBox1
(la racine carrée de 64). Bien entendu, si l’utilisateur saisit une chaîne non valide dans TextBox2
, si la chaîne contient le nom d’une propriété au lieu d’une méthode, ou s’il y avait un autre argument requis pour la méthode, une erreur d’exécution se produit. Vous devez ajouter un code de gestion des erreurs robuste lorsque vous utilisez CallByName
pour anticiper ces erreurs ou d’autres.
Notes
Bien que la fonction CallByName
puisse être utile dans certains cas, vous devez évaluer son utilité par rapport aux implications en matière de performances. L’utilisation de CallByName
pour invoquer une procédure est légèrement plus lente qu’un appel lié tardivement. Si vous invoquer une fonction appelée à plusieurs reprises, par exemple à l’intérieur d’une boucle, CallByName
peut gravement nuire aux performances.