Вызов свойства или метода с помощью строкового имени (Visual Basic)
В большинстве случаев можно обнаружить свойства и методы объекта во время разработки и написать код для их обработки. Однако в некоторых случаях вы не можете заранее знать о свойствах и методах объекта, или вы можете просто потребовать гибкости, чтобы пользователь мог указать свойства или выполнить методы во время выполнения.
Функция CallByName
Рассмотрим, например, клиентское приложение, которое вычисляет выражения, введенные пользователем, путем передачи оператора в COM-компонент. Предположим, что вы постоянно добавляете новые функции в компонент, требующий новых операторов. При использовании стандартных методов доступа к объектам необходимо перекомпилировать и распространить клиентское приложение, прежде чем он сможет использовать новые операторы. Чтобы избежать этого, можно использовать CallByName
функцию для передачи новых операторов в виде строк, не изменяя приложение.
Функция CallByName
позволяет использовать строку для указания свойства или метода во время выполнения. Подпись функции CallByName
выглядит следующим образом:
ResultCallByName
= (Object, ProcedureName, CallType, Arguments())
Первый аргумент , объект, принимает имя объекта, на который вы хотите действовать. Аргумент ProcedureName принимает строку, содержащую имя вызываемой процедуры метода или свойства. Аргумент CallType принимает константу, представляющую тип процедуры для вызова: метод (), свойство read (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
обработки ошибок.
Примечание.
CallByName
Хотя функция может оказаться полезной в некоторых случаях, необходимо взвесить ее полезность в отношении последствий производительности— использование для CallByName
вызова процедуры немного медленнее, чем вызов с поздней привязкой. Если вы вызываете функцию, которая вызывается многократно, например внутри цикла, CallByName
может оказать серьезное влияние на производительность.