Compartir a través de


Llamar a una propiedad o método mediante un nombre de cadena

Actualización: noviembre 2007

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

CallByName (Función)

Piense, por ejemplo, en una aplicación cliente que evalúe expresiones escritas por el usuario mediante el paso de un operador a un componente COM. Suponga que está agregando constantemente funciones nuevas al componente que requiere operadores nuevos. Cuando use las técnicas estándar de acceso a objetos, debe compilar y distribuir de nuevo la aplicación cliente para poder utilizar los operadores nuevos. Para evitarlo, puede utilizar la función CallByName para pasar los operadores nuevos como cadenas, sin modificar la aplicación.

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

Resultado = CallByName(Objeto, nombreDeProcedimiento, tipoDeLlamada, Argumentos())

El primer argumento, Objeto, toma el nombre del objeto sobre el que desea actuar. El argumento nombreDeProcedimiento toma una cadena que contiene el nombre del procedimiento de propiedad o método que debe invocarse. El argumento tipoDeLlamada toma una constante que representa el tipo de procedimiento que debe invocarse: un método (Microsoft.VisualBasic.CallType.Method), una lectura de propiedad (Microsoft.VisualBasic.CallType.Get) o un conjunto de propiedades (Microsoft.VisualBasic.CallType.Set). El argumento Argumentos, que es opcional, toma una matriz de tipo Object que contiene los argumentos para el procedimiento.

Puede utilizar CallByName con clases en la solución actual, pero se utiliza más frecuentemente para obtener acceso a objetos COM o a objetos de ensamblados de .NET Framework.

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

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 utilizar controles de cuadro de texto para controlar qué método se va a llamar y sus argumentos. Por ejemplo, si TextBox1 contiene la expresión que se va a evaluar y TextBox2 se utiliza para escribir el nombre de la función, puede utilizar el siguiente código para invocar la función SquareRoot en la expresión de 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 que aparece en TextBox1. El código del ejemplo invoca la función SquareRoot (que toma una cadena con la expresión que se va a evaluar como argumento requerido) y devuelve "8" en TextBox1 (la raíz cuadrada de 64). Si el usuario escribe una cadena no válida en TextBox2, o si la cadena contiene el nombre de una propiedad en lugar de un método, o si el método tiene un argumento necesario adicional, sin duda se producirá un error en tiempo de ejecución. Debe agregar un código de control de errores sólido cuando use CallByName para prever estos errores u otros.

Nota:

Mientras que la función CallByName puede ser útil en algunas situaciones, debe sopesar su utilidad frente a las implicaciones de rendimiento; el uso de CallByName para invocar un procedimiento es un poco más lento que una llamada enlazada en tiempo de ejecución. Si está invocando una función a la que se llama repetidamente, como ocurriría dentro de un bucle, CallByName puede afectar de forma grave al rendimiento.

Vea también

Tareas

Cómo: Realizar varias acciones en un objeto

Conceptos

Determinar el tipo de objeto

Referencia

CallByName (Función)

Otros recursos

Obtener información de clases en tiempo de ejecución