Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Na maioria dos casos, você pode descobrir as propriedades e os métodos de um objeto em tempo de design e escrever código para manipulá-los. No entanto, em alguns casos, você pode não saber sobre as propriedades e métodos de um objeto com antecedência, ou você pode apenas querer a flexibilidade de permitir que um usuário final especifique propriedades ou execute métodos em tempo de execução.
Função CallByName
Considere, por exemplo, um aplicativo cliente que avalia expressões inseridas pelo usuário passando um operador para um componente COM. Suponha que você esteja constantemente adicionando novas funções ao componente que exigem novos operadores. Ao usar técnicas padrão de acesso a objetos, você deve recompilar e redistribuir o aplicativo cliente antes que ele possa usar os novos operadores. Para evitar isso, você pode usar a CallByName função para passar os novos operadores como strings, sem alterar o aplicativo.
A CallByName função permite que você use uma cadeia de caracteres para especificar uma propriedade ou método em tempo de execução. A assinatura da função CallByName é apresentada da seguinte forma:
Resultado = CallByName(Objeto, ProcedureName, CallType, Arguments())
O primeiro argumento, Object, leva o nome do objeto sobre o qual você deseja agir. O argumento ProcedureName usa uma cadeia de caracteres que contém o nome do método ou procedimento de propriedade a ser invocado. O argumento CallType usa uma constante que representa o tipo de procedimento a ser invocado: um método (Microsoft.VisualBasic.CallType.Method), uma propriedade lida (Microsoft.VisualBasic.CallType.Get) ou um conjunto de propriedades (Microsoft.VisualBasic.CallType.Set). O argumento Argumentos , que é opcional, leva uma matriz do tipo Object que contém quaisquer argumentos para o procedimento.
Você pode usar CallByName com classes em sua solução atual, mas é usado com mais freqüência para acessar objetos COM ou objetos de assemblies do .NET Framework.
Suponha que você adicione uma referência a um assembly que contém uma classe chamada MathClass, que tem uma nova função chamada SquareRoot, conforme mostrado no código a seguir:
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
Seu aplicativo pode usar controles de caixa de texto para controlar qual método será chamado e seus argumentos. Por exemplo, se TextBox1 contiver a expressão a ser avaliada e TextBox2 for usada para inserir o nome da função, você poderá usar o código a seguir para invocar a SquareRoot função na expressão em 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
Se introduzir "64" em TextBox1, "RaizQuadrada" em TextBox2 e, em seguida, chamar o procedimento CallMath, a raiz quadrada do número em TextBox1 será avaliada. O código no exemplo invoca a SquareRoot função (que usa uma cadeia de caracteres que contém a expressão a ser avaliada como um argumento necessário) e retorna "8" em TextBox1 (a raiz quadrada de 64). Claro, se o usuário inserir uma cadeia de caracteres inválida em TextBox2, se a cadeia de caracteres contiver o nome de uma propriedade em vez de um método, ou se o método tiver um argumento adicional necessário, ocorrerá um erro em tempo de execução. Você tem que adicionar um código robusto de tratamento de erros quando você usa CallByName para antecipar esses ou quaisquer outros erros.
Observação
Embora a CallByName função possa ser útil em alguns casos, você deve pesar sua utilidade em relação às implicações de desempenho — usar CallByName para invocar um procedimento é um pouco mais lento do que uma chamada tardia. Se você estiver invocando uma função que é chamada repetidamente, como dentro de um loop, CallByName pode ter um efeito severo no desempenho.