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.

Weitere Informationen