Compartilhar via


Chamando uma propriedade ou método usando um nome de cadeia de caracteres (Visual Basic)

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 lidar com eles. No entanto, em alguns casos, talvez você não saiba mais sobre as propriedades e os métodos de um objeto com antecedência ou talvez queira apenas a flexibilidade de habilitar um usuário final para especificar propriedades ou executar métodos em tempo de execução.

Função CallByName

Considere, por exemplo, um aplicativo cliente que avalia as 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 exige novos operadores. Ao usar técnicas de acesso a objetos padrão, 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 cadeias de caracteres, 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 é assim:

Resultado = CallByName(Object, ProcedureName, CallType, Arguments())

O primeiro argumento, Object, usa o nome do objeto em que 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 leitura de propriedade (Microsoft.VisualBasic.CallType.Get) ou um conjunto de propriedades (Microsoft.VisualBasic.CallType.Set). O argumento Arguments , que é opcional, usa uma matriz de tipo Object que contém argumentos para o procedimento.

Você pode usar CallByName com classes em sua solução atual, mas ele geralmente é usado para acessar objetos COM ou objetos de assemblies do .NET Framework.

Suponha que você adicione uma referência a um assembly que contenha uma classe chamada MathClass, que tem uma nova função nomeada 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 você inserir "64" em TextBox1, "SquareRoot" em TextBox2, e depois 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, TextBox2se 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ê precisa adicionar um código robusto de tratamento de erros ao usar CallByName para prever esses ou quaisquer outros erros.

Observação

Embora a CallByName função possa ser útil em alguns casos, você deve avaliar 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 chamada repetidamente, como dentro de um loop, CallByName poderá ter um efeito severo no desempenho.

Consulte também