Condividi tramite


Chiamata di una proprietà o di un metodo tramite un nome 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. Tuttavia, in alcuni casi è possibile che non si conoscano in anticipo le proprietà e i metodi di un oggetto oppure si potrebbe semplicemente volere la flessibilità di 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 nuove funzioni al componente 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 CallByName funzione per passare i nuovi operatori come stringhe, senza modificare l'applicazione.

La CallByName funzione consente di usare una stringa per specificare una proprietà o un metodo in fase di esecuzione. La firma per la CallByName funzione è simile alla seguente:

Risultato = 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 del metodo o della routine di 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 un set di proprietà (Microsoft.VisualBasic.CallType.Set). L'argomento Arguments, facoltativo, accetta una matrice di tipo Object che contiene argomenti alla procedura.

È possibile usare CallByName con le classi nella soluzione corrente, ma viene spesso usato per accedere a oggetti o oggetti COM da assembly .NET Framework.

Si supponga di aggiungere un riferimento a un assembly contenente una classe denominata , che ha una nuova funzione denominata MathClassSquareRoot, 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. Ad esempio, se TextBox1 contiene l'espressione da valutare e TextBox2 viene usato per immettere il nome della funzione, è possibile usare il codice seguente per richiamare la SquareRoot funzione nell'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 poi si chiama la procedura in CallMath, viene valutata la radice quadrata del numero in TextBox1. Il codice nell'esempio richiama la SquareRoot funzione (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. È necessario aggiungere codice di gestione degli errori affidabile quando si usano CallByName per anticipare questi o altri errori.

Annotazioni

Anche se la CallByName funzione può essere utile in alcuni casi, è necessario valutarne l'utilità rispetto alle implicazioni relative alle prestazioni. L'uso di CallByName per richiamare una routine è 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 effetto grave sulle prestazioni.

Vedere anche