Wywoływanie właściwości lub metody za pomocą nazwy ciągu (Visual Basic)
W większości przypadków można odnaleźć właściwości i metody obiektu w czasie projektowania i napisać kod do ich obsługi. Jednak w niektórych przypadkach możesz nie wiedzieć o właściwościach i metodach obiektu z wyprzedzeniem lub możesz po prostu chcieć mieć elastyczność włączania użytkownikowi końcowemu określania właściwości lub wykonywania metod w czasie wykonywania.
CallByName, funkcja
Rozważmy na przykład aplikację kliencką, która ocenia wyrażenia wprowadzone przez użytkownika, przekazując operator do składnika COM. Załóżmy, że stale dodajesz nowe funkcje do składnika, który wymaga nowych operatorów. W przypadku używania standardowych technik dostępu do obiektów należy ponownie skompilować i ponownie rozpowszechnić aplikację kliencką, zanim będzie mogła korzystać z nowych operatorów. Aby tego uniknąć, możesz użyć CallByName
funkcji , aby przekazać nowe operatory jako ciągi bez zmiany aplikacji.
Funkcja CallByName
umożliwia określenie właściwości lub metody w czasie wykonywania za pomocą ciągu. Podpis funkcji CallByName
wygląda następująco:
Result = CallByName
(Object, ProcedureName, CallType, Arguments())
Pierwszy argument Object przyjmuje nazwę obiektu, na którym chcesz działać. Argument ProcedureName przyjmuje ciąg, który zawiera nazwę metody lub procedury właściwości do wywołania. Argument CallType przyjmuje stałą reprezentującą typ procedury do wywołania: metodę (Microsoft.VisualBasic.CallType.Method
), odczyt właściwości (Microsoft.VisualBasic.CallType.Get
) lub zestaw właściwości (Microsoft.VisualBasic.CallType.Set
). Argumenty argumentów, który jest opcjonalny, przyjmuje tablicę typuObject
, która zawiera wszelkie argumenty do procedury.
Można używać z CallByName
klasami w bieżącym rozwiązaniu, ale najczęściej jest używany do uzyskiwania dostępu do obiektów lub obiektów COM z zestawów programu .NET Framework.
Załóżmy, że dodasz odwołanie do zestawu zawierającego klasę o nazwie , która ma nową funkcję o nazwie MathClass
SquareRoot
, jak pokazano w poniższym kodzie:
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
Aplikacja może używać kontrolek pól tekstowych do kontrolowania, która metoda zostanie wywołana i jej argumenty. Jeśli na przykład TextBox1
zawiera wyrażenie do obliczenia i TextBox2
służy do wprowadzania nazwy funkcji, możesz użyć następującego kodu, aby wywołać SquareRoot
funkcję w wyrażeniu w TextBox1
pliku :
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
Jeśli wprowadzisz wartość "64" w pliku TextBox1
, "SquareRoot" w TextBox2
pliku , a następnie wywołasz procedurę CallMath
, zostanie obliczony pierwiastek kwadratowy liczby w TextBox1
. Kod w przykładzie wywołuje SquareRoot
funkcję (która przyjmuje ciąg zawierający wyrażenie do obliczenia jako argument wymagany) i zwraca wartość "8" w TextBox1
(pierwiastek kwadratowy 64). Oczywiście jeśli użytkownik wprowadzi nieprawidłowy ciąg w TextBox2
pliku , jeśli ciąg zawiera nazwę właściwości zamiast metody, lub jeśli metoda ma dodatkowy argument wymagany, wystąpi błąd czasu wykonywania. Należy dodać niezawodny kod obsługi błędów, gdy używasz CallByName
go do przewidywania tych lub innych błędów.
Uwaga
CallByName
Chociaż funkcja może być przydatna w niektórych przypadkach, należy rozważyć jej użyteczność względem implikacji wydajności — użycie metody CallByName
do wywołania procedury jest nieco wolniejsze niż wywołanie związane z opóźnieniem. Jeśli wywoływana jest funkcja, która jest wywoływana wielokrotnie, na przykład wewnątrz pętli, CallByName
może mieć poważny wpływ na wydajność.