Compartilhar via


Chamando uma propriedade ou um método usando o nome de uma 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 das propriedades e 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 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 de acesso a objetos padrão, você precisa recompilar e redistribuir o aplicativo cliente antes que ele possa usar os novos operadores. Para evitar isso, você pode usar a função CallByName para passar os novos operadores como cadeias de caracteres, sem alterar o aplicativo.

A função CallByName 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 deverá ser assim:

Result = 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 propriedade lida (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 ela é mais usada para acessar objetos ou objetos COM de assemblies do .NET Framework.

Suponha que você adicione uma referência a um assembly que contém uma classe de nome MathClass, que tem uma nova função denominada 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 os respectivos 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 função SquareRoot 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, em seguida, chamar o procedimento CallMath, a raiz quadrada do número em TextBox1 será avaliada. O código no exemplo invoca a função SquareRoot (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 que, 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ê precisa adicionar um código robusto de tratamento de erros ao usar CallByName para antecipar esses ou quaisquer outros erros.

Observação

Embora a função CallByName 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 com associação tardia. Se você estiver invocando uma função chamada repetidamente, como dentro de um loop, CallByName poderá ter um efeito severo no desempenho.

Confira também