Поделиться через


Вызов свойства или метода с помощью имени строки (Visual Basic)

В большинстве случаев можно обнаружить свойства и методы объекта во время разработки и написать код для их обработки. Однако в некоторых случаях вы не можете заранее знать о свойствах и методах объекта, или вы можете просто потребовать гибкости, чтобы пользователь мог указать свойства или выполнить методы во время выполнения.

Функция CallByName

Рассмотрим, например, клиентское приложение, которое вычисляет выражения, введенные пользователем, путем передачи оператора в COM-компонент. Предположим, что вы постоянно добавляете новые функции в компонент, требующий новых операторов. При использовании стандартных методов доступа к объектам необходимо перекомпилировать и распространить клиентское приложение, прежде чем он сможет использовать новые операторы. Чтобы избежать этого, можно использовать CallByName функцию для передачи новых операторов в виде строк, не изменяя приложение.

Функция CallByName позволяет использовать строку для указания свойства или метода во время выполнения. Подпись функции CallByName выглядит следующим образом:

Результат = CallByName(Object, ProcedureName, CallType, Arguments())

Первый аргумент , объект, принимает имя объекта, на который вы хотите действовать. Аргумент ProcedureName принимает строку, содержащую имя вызываемой процедуры метода или свойства. Аргумент CallType принимает константу, представляющую тип процедуры для вызова: метод (), свойство read (Microsoft.VisualBasic.CallType.MethodMicrosoft.VisualBasic.CallType.Get) или набор свойств (Microsoft.VisualBasic.CallType.Set). Аргумент "Аргументы", который является необязательным, принимает массив типаObject, который содержит любые аргументы в процедуру.

Вы можете использовать CallByName с классами в вашем текущем решении, но оно чаще всего используется для доступа к COM-объектам или объектам из сборок .NET Framework.

Предположим, что вы добавляете ссылку на сборку, содержащую класс с именем MathClass, который имеет новую функцию с именем SquareRoot, как показано в следующем коде.

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

Приложение может использовать элементы управления текстовым полем для управления вызовом метода и его аргументами. Например, если TextBox1 содержит вычисляемое выражение и TextBox2 используется для ввода имени функции, можно использовать следующий код для вызова SquareRoot функции в 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

Если ввести "64" в TextBox1, "SquareRoot" в TextBox2, а затем вызвать процедуру CallMath, вычисляется квадратный корень числа TextBox1. Код в примере вызывает SquareRoot функцию (которая принимает строку, содержащую выражение для вычисления как обязательный аргумент) и возвращает значение "8" в TextBox1 (квадратный корень 64). Конечно, если пользователь вводит недопустимую строку в , если строка TextBox2содержит имя свойства вместо метода или если метод имел дополнительный обязательный аргумент, возникает ошибка во время выполнения. При использовании CallByName необходимо добавить надежный код обработки ошибок, чтобы предвосхитить эти или любые другие ошибки.

Замечание

Хотя функция CallByName может оказаться полезной в некоторых случаях, необходимо взвесить ее полезность с учетом влияния на производительность — использование CallByName для вызова процедуры немного медленнее, чем вызов с поздней привязкой. Если вы вызываете функцию, которая вызывается многократно, например внутри цикла, CallByName может оказать серьезное влияние на производительность.

См. также