Chiamata di una proprietà o di un metodo mediante un nome di stringa (Visual Basic)
Nella maggior parte dei casi è possibile individuare le proprietà e i metodi di un oggetto in fase di progettazione e scrivere codice per gestirli. In alcuni casi è tuttavia possibile che non si conoscano in anticipo le proprietà e i metodi di un oggetto oppure si potrebbe semplicemente volere la flessibilità necessaria per consentire a un utente finale di specificare proprietà o eseguire metodi in fase di esecuzione.
Funzione CallByName
Si consideri, ad esempio, un'applicazione client che valuta le espressioni immesse dall'utente passando un operatore a un componente COM. Si supponga di aggiungere costantemente al componente nuove funzioni che richiedono nuovi operatori. Quando si usano tecniche di accesso agli oggetti standard, è necessario ricompilare e ridistribuire l'applicazione client prima di poter usare i nuovi operatori. Per evitare questo problema, è possibile usare la funzione CallByName
per passare i nuovi operatori come stringhe, senza modificare l'applicazione.
La funzione CallByName
consente di usare una stringa per specificare una proprietà o un metodo in fase di esecuzione. La firma per la funzione CallByName
è simile alla seguente:
Result = CallByName
(Object, ProcedureName, CallType, Arguments())
Il primo argomento, Object, accetta il nome dell'oggetto su cui si vuole agire. L'argomento ProcedureName accetta una stringa contenente il nome della routine del metodo o della proprietà da richiamare. L'argomento CallType accetta una costante che rappresenta il tipo di routine da richiamare: un metodo (Microsoft.VisualBasic.CallType.Method
), una proprietà letta (Microsoft.VisualBasic.CallType.Get
) o una proprietà impostata (Microsoft.VisualBasic.CallType.Set
). L'argomento facoltativo Arguments accetta una matrice di tipo Object
che contiene argomenti nella routine.
È possibile usare CallByName
con classi nella soluzione corrente, ma questa funzione viene spesso usata per accedere a oggetti oppure oggetti COM da assembly .NET Framework.
Si supponga di aggiungere un riferimento a un assembly contenente una classe denominata MathClass
, che ha una nuova funzione denominata SquareRoot
, come illustrato nel codice seguente:
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
L'applicazione può usare controlli casella di testo per controllare quale metodo verrà chiamato e i relativi argomenti. Se ad esempio TextBox1
contiene l'espressione da valutare e si usa TextBox2
per immettere il nome della funzione, è possibile usare il codice seguente per richiamare la funzione SquareRoot
sull'espressione in 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 si immette "64" in TextBox1
, "SquareRoot" in TextBox2
e quindi si chiama la routine CallMath
, viene valutata la radice quadrata del numero in TextBox1
. Il codice nell'esempio richiama la funzione SquareRoot
, che accetta una stringa contenente l'espressione da valutare come argomento obbligatorio, e restituisce "8" in TextBox1
(radice quadrata di 64). Naturalmente, se l'utente immette una stringa non valida in TextBox2
, se la stringa contiene il nome di una proprietà anziché un metodo o se il metodo ha un argomento obbligatorio aggiuntivo, si verifica un errore di run-time. Per anticipare questi o altri errori, è necessario aggiungere codice di gestione degli errori affidabile quando si usa CallByName
.
Nota
Anche se la funzione CallByName
può essere utile in alcuni casi, è necessario valutarne l'utilità rispetto alle implicazioni sulle prestazioni. L'uso di CallByName
per richiamare una routine è infatti leggermente più lento rispetto a una chiamata con associazione tardiva. Se si richiama ripetutamente una funzione, ad esempio all'interno di un ciclo, CallByName
può avere un impatto significativo sulle prestazioni.