Partager via


Appel d’une propriété ou d’une 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 méthodes d’un objet au moment du design et écrire du code pour les gérer. Toutefois, dans certains cas, vous ne connaissez peut-être pas les propriétés et les méthodes d’un objet à l’avance, ou vous souhaiterez peut-être 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 de pouvoir utiliser les nouveaux opérateurs. Pour éviter cela, vous pouvez utiliser la CallByName fonction pour passer les nouveaux opérateurs en tant que chaînes, sans modifier l’application.

La CallByName fonction 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 CallByName fonction ressemble à ceci :

Résultat = 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 , facultatif, prend 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 aux objets COM ou aux objets des assemblages du .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 qui sera appelée et ses arguments. Par exemple, si TextBox1 contient l’expression à évaluer et TextBox2 est utilisée 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 entrez « 64 » dans TextBox1, « SquareRoot » dans TextBox2, puis appelez la CallMath procédure, la racine carrée du nombre dans TextBox1 est évaluée. Le code de l’exemple appelle la SquareRoot fonction (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 sûr, si l’utilisateur entre 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 si la méthode a un argument requis supplémentaire, une erreur d’exécution se produit. Vous devez ajouter du code de gestion des erreurs robuste lorsque vous l’utilisez CallByName pour anticiper ces erreurs ou d’autres erreurs.

Remarque

Bien que la fonction CallByName puisse être utile dans certains cas, vous devez peser son utilité contre les implications en matière de performances : l’utilisation de CallByName pour invoquer une procédure est légèrement plus lente qu’un appel à liaison retardée. Si vous appelez une fonction appelée à plusieurs reprises, comme à l’intérieur d’une boucle, CallByName peut avoir un effet grave sur les performances.

Voir aussi