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


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

Обновлен: Ноябрь 2007

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

Функция CallByName

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

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

Результат = CallByName(Объект, Имя процедуры, Тип вызова, Аргументы())

Первый аргумент, Объект, принимает имя объекта, над которым совершаются действия. Аргумент Имя процедуры принимает строку, содержащую имя метода или свойства вызываемой процедуры. Аргумент CallType принимает константу, являющейся типом вызываемой процедуры: метода (Microsoft.VisualBasic.CallType.Method), считанного свойства (Microsoft.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, чтобы реагировать на эти или другие ошибки.

22x2chfx.alert_note(ru-ru,VS.90).gifПримечание.

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

См. также

Задачи

Практическое руководство. Выполнение нескольких действий над объектом

Основные понятия

Определение типа объекта

Ссылки

Функция CallByName

Другие ресурсы

Получение сведений о классе во время выполнения