Condividi tramite


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.

Vedi anche