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


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

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

Функция CallByName

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

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

ResultCallByName = (Object, ProcedureName, CallType, Arguments())

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

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

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

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 может оказать серьезное влияние на производительность.

См. также