Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В большинстве случаев можно обнаружить свойства и методы объекта во время разработки и написать код для их обработки. Однако в некоторых случаях вы не можете заранее знать о свойствах и методах объекта, или вы можете просто потребовать гибкости, чтобы пользователь мог указать свойства или выполнить методы во время выполнения.
Функция 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 может оказать серьезное влияние на производительность.