Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Wynik = 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
). Argument Arguments, jest opcjonalny, przyjmuje tablicę typu Object
, która zawiera wszelkie argumenty do procedury.
Można używać CallByName
z klasami w bieżącym rozwiązaniu, ale najczęściej jest on używany do uzyskiwania dostępu do obiektów COM lub obiektów 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, a TextBox2
służy do wprowadzenia nazwy funkcji, możesz użyć następującego kodu, aby wywołać funkcję SquareRoot
na wyrażeniu w 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
Jeśli wprowadzisz wartość "64" w TextBox1
, "SquareRoot" w TextBox2
, a następnie wywołasz procedurę CallMath
, zostanie obliczony pierwiastek kwadratowy liczby w TextBox1
. Kod w prostym przykładzie wywołuje funkcję SquareRoot
(która przyjmuje ciąg zawierający wyrażenie do obliczenia jako argument wymagany) i zwraca "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
do przewidywania tych lub innych błędów.
Uwaga / Notatka
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ść.