Aufrufen einer Eigenschaft oder Methode mit einem Zeichenfolgennamen (Visual Basic)
In den meisten Fällen können Sie die Eigenschaften und Methoden eines Objekts zur Entwurfszeit ermitteln und Code für deren Bearbeitung schreiben. In einigen Fällen kennen Sie die Eigenschaften und Methoden eines Objekts jedoch möglicherweise nicht im Voraus, oder Sie möchten einfach nur die Flexibilität haben, Endbenutzer*innen das Angeben von Eigenschaften oder das Ausführen von Methoden zur Runtime zu ermöglichen.
CallByName-Funktion
Nehmen wir beispielsweise eine Clientanwendung, die vom Benutzer eingegebene Ausdrücke auswertet, indem sie einen Operator an eine COM-Komponente übergibt. Angenommen, Sie fügen der Komponente ständig neue Funktionen hinzu, die neue Operatoren erfordern. Wenn Sie Standardmethoden für den Objektzugriff verwenden, müssen Sie die Clientanwendung erneut kompilieren und verteilen, bevor sie die neuen Operatoren verwenden kann. Um dies zu vermeiden, können Sie die CallByName
-Funktion verwenden, um die neuen Operatoren als Zeichenfolgen zu übergeben, ohne die Anwendung zu ändern.
Bei der CallByName
-Funktion können Sie eine Zeichenfolge verwenden, um eine Eigenschaft oder Methode zur Runtime anzugeben. Die Signatur für die CallByName
-Funktion sieht folgendermaßen aus:
Ergebnis = CallByName
(Object, ProcedureName, CallType, Arguments())
Das erste Argument Object verwendet den Namen des Objekts, um das es hier geht. Das Argument ProcedureName akzeptiert eine Zeichenfolge, die den Namen der aufzurufenden Methode oder Eigenschaftsprozedur enthält. Das Argument CallType verwendet eine Konstante, die den Typ der aufzurufenden Prozedur darstellt: eine Methode (Microsoft.VisualBasic.CallType.Method
), eine gelesene Eigenschaft (Microsoft.VisualBasic.CallType.Get
) oder eine festgelegte Eigenschaft (Microsoft.VisualBasic.CallType.Set
). Das Argument Arguments, das optional ist, verwendet ein Array vom Typ Object
, das alle Argumente für die Prozedur enthält.
Sie können CallByName
in Ihrer aktuellen Lösung mit Klassen verwenden, aber es wird am häufigsten für den Zugriff auf COM-Objekte oder Objekte aus .NET Framework-Assemblys verwendet.
Angenommen, Sie fügen einen Verweis auf eine Assembly hinzu, die eine Klasse mit dem Namen MathClass
enthält, die über eine neue Funktion namens SquareRoot
verfügt, wie im folgenden Code gezeigt:
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
Ihre Anwendung könnte Textfeldsteuerelemente verwenden, um zu steuern, welche Methode mit welchen Argumenten aufgerufen wird. Wenn z. B. TextBox1
den auszuwertenden Ausdruck enthält und TextBox2
zum Eingeben des Namens der Funktion verwendet wird, können Sie den folgenden Code verwenden, um die SquareRoot
-Funktion für den Ausdruck in TextBox1
aufzurufen:
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
Wenn Sie „64“ in TextBox1
und „SquareRoot“ in TextBox2
eingeben und dann die CallMath
-Prozedur aufrufen, wird die Quadratwurzel der Zahl in TextBox1
berechnet. Der Code im Beispiel ruft die SquareRoot
-Funktion auf (die eine Zeichenfolge nutzt, die den zu berechnenden Ausdruck als erforderliches Argument enthält) und gibt „8“ (die Quadratwurzel von 64) in TextBox1
zurück. Wenn Benutzer*innen natürlich eine ungültige Zeichenfolge in TextBox2
eingeben und die Zeichenfolge den Namen einer Eigenschaft anstelle einer Methode enthält oder wenn die Methode ein zusätzliches erforderliches Argument aufweist, tritt ein Runtimefehler auf. Sie müssen einen robusten Fehlerbehandlungscode hinzufügen, wenn Sie CallByName
verwenden, um diese oder andere Fehler zu antizipieren.
Hinweis
Die CallByName
-Funktion ist zwar in einigen Fällen nützlich, Sie müssen dies aber gegenüber den Leistungseinschränkungen abwägen. Die Verwendung von CallByName
zum Aufrufen einer Prozedur ist etwas langsamer als ein spät gebundener Aufruf. Wenn Sie eine Funktion aufrufen, die wiederholt aufgerufen wird, z. B. innerhalb einer Schleife, kann CallByName
schwerwiegende Auswirkungen auf die Leistung haben.