Udostępnij za pośrednictwem


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 MathClassSquareRoot, 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 TextBox1pliku :

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 TextBox2pliku , 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 TextBox2pliku , 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ść.

Zobacz też