Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 las propiedades y los métodos de un objeto de antemano, o es posible 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 CallByName
función para pasar los nuevos operadores como cadenas, sin cambiar la aplicación.
La CallByName
función permite usar una cadena para especificar una propiedad o método en tiempo de ejecución. La firma de la CallByName
función tiene este 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 de lectura (Microsoft.VisualBasic.CallType.Get
) o un conjunto de propiedades (Microsoft.VisualBasic.CallType.Set
). El argumento Arguments , que es opcional, toma una matriz de 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 o objetos de 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 SquareRoot
función 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 SquareRoot
función (que toma una cadena que contiene la expresión que se va a evaluar como un 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 necesario adicional, se produce un error en tiempo de ejecución. Debe agregar código sólido de control de errores cuando se usa CallByName
para prever estos errores 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 a la que se llama repetidamente, como dentro de un bucle, CallByName
puede tener un efecto grave en el rendimiento.