Compartir a través de


Llamar a una propiedad o método mediante un nombre de cadena (Visual Basic)

En la mayoría de los casos, puede detectar las propiedades y los métodos de un objeto en tiempo de diseño y escribir código para controlarlos. Sin embargo, en algunos casos es posible que no conozca de antemano las propiedades y los métodos de un objeto, o puede que solo desee la flexibilidad de permitir que un usuario final especifique propiedades o ejecute métodos en tiempo de ejecución.

Función CallByName

Considere, por ejemplo, una aplicación cliente que evalúa las expresiones especificadas por el usuario pasando un operador a un componente COM. Supongamos que está agregando constantemente nuevas funciones al componente que requieren nuevos operadores. Al usar técnicas de acceso a objetos estándar, debe volver a compilar y redistribuir la aplicación cliente para poder usar los nuevos operadores. Para evitar esto, puede usar la función CallByName para pasar los nuevos operadores como cadenas, sin cambiar la aplicación.

La función CallByName permite usar una cadena para especificar una propiedad o un método en tiempo de ejecución. La firma de la función CallByName tiene el siguiente aspecto:

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

El primer argumento, Object, toma el nombre del objeto sobre el que desea actuar. El argumento ProcedureName toma una cadena que contiene el nombre del método o procedimiento de propiedad que se va a invocar. El argumento CallType toma una constante que representa el tipo de procedimiento que se va a invocar: un método (Microsoft.VisualBasic.CallType.Method), una propiedad leída (Microsoft.VisualBasic.CallType.Get) o un conjunto de propiedades (Microsoft.VisualBasic.CallType.Set). El argumento Arguments, que es opcional, toma una matriz del tipo Object que contiene los argumentos del procedimiento.

Puede usar CallByName con clases en la solución actual, pero se usa con más frecuencia para tener acceso a objetos COM desde ensamblados de .NET Framework.

Supongamos que agrega una referencia a un ensamblado que contiene una clase denominada MathClass, que tiene una nueva función denominada SquareRoot, como se muestra en el código siguiente:

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

La aplicación podría usar controles de cuadro de texto para controlar a qué método se llamará y sus argumentos. Por ejemplo, si TextBox1 contiene la expresión que se va a evaluar y TextBox2 se usa para escribir el nombre de la función, puede usar el código siguiente para invocar la función SquareRoot en la expresión en 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

Si escribe "64" en TextBox1, "SquareRoot" en TextBox2 y, a continuación, llama al procedimiento CallMath, se evalúa la raíz cuadrada del número en TextBox1. El código del ejemplo invoca la función SquareRoot (que toma una cadena que contiene la expresión que se va a evaluar como argumento obligatorio) y devuelve "8" en TextBox1 (la raíz cuadrada de 64). Por supuesto, si el usuario escribe una cadena no válida en TextBox2, si la cadena contiene el nombre de una propiedad en lugar de un método, o si el método tenía un argumento obligatorio adicional, se produce un error en tiempo de ejecución. Tiene que agregar código sólido de control de errores cuando se usa CallByName para anticiparlos o cualquier otro error.

Nota

Aunque la función CallByName puede ser útil en algunos casos, debe ponderar su utilidad con respecto a las implicaciones de rendimiento; el uso de CallByName para invocar un procedimiento es ligeramente más lento que una llamada enlazada en tiempo de ejecución. Si invoca una función que se llama repetidamente, como dentro de un bucle, CallByName puede tener un efecto grave en el rendimiento.

Consulte también