Associazione tardiva nelle soluzioni Office

Alcuni tipi nei modelli a oggetti di applicazioni di Office forniscono una funzionalità disponibile tramite le funzionalità di associazione tardiva. Ad esempio, alcuni metodi e proprietà possono restituire diversi tipi di oggetti in base al contesto dell'applicazione di Office e alcuni tipi possono esporre metodi o proprietà diversi in contesti diversi.

Si applica a: le informazioni fornite in questo argomento sono valide per i progetti a livello di documento e di applicazione per Microsoft Office 2010 e Microsoft Office System 2007. Per ulteriori informazioni, vedere Funzionalità disponibili in base ai tipi di progetto e applicazioni di Office.

I progetti di Visual Basic dove Option Strict non è attiva e i progetti di Visual C# che hanno .NET Framework 4 come destinazione, possono lavorare direttamente con tipi che utilizzano queste funzionalità di associazione tardiva. I progetti di Visual Basic dove Option Strict è attiva e i progetti di Visual C# che hanno .NET Framework 3.5 come destinazione devono eseguire il cast o la reflection per utilizzare questi tipi.

Esecuzione del cast implicita ed esplicita dei valori restituiti dell'oggetto

Molti metodi e proprietà degli assembly di interoperabilità primari di Microsoft Office restituiscono i valori Object poiché possono restituire diversi tipi di oggetti. Ad esempio, la proprietà ActiveSheet restituisce un Object perché il valore restituito può essere un oggetto Worksheet o Chart, in base al foglio attivo.

Quando un metodo o una proprietà restituisce un Object, è necessario convertire in modo esplicito (in Visual Basic) o eseguire il cast (in C#) dell'oggetto al tipo corretto nei progetti di Visual Basic dove Option Strict è attiva e i progetti di Visual C# che hanno .NET Framework 3.5 come destinazione. Non è necessario eseguire il cast in modo esplicito dei valori restituiti Object nei progetti di Visual Basic dove Option Strict non è attiva e nei progetti di Visual C# che hanno .NET Framework 4 come destinazione.

Nella maggior parte dei casi, nella documentazione di riferimento vengono elencati i possibili tipi di valore restituito per un membro che restituisce un Object. La conversione o il cast dell'oggetto determina l'attivazione di IntelliSense per tale l'oggetto nell'editor del codice.

Per informazioni sulla conversione in Visual Basic, vedere Implicit and Explicit Conversions e CType Function. Per informazioni sull'esecuzione del cast in Visual C#, vedere Casting and Type Conversions (C# Programming Guide) e () Operator (C# Reference).

Esempi

Nell'esempio di codice seguente viene dimostrato come eseguire il cast di un oggetto a un tipo specifico in un progetto di Visual Basic dove Option Strict è attiva o in un progetto di Visual C# che ha .NET Framework 3.5 come destinazione. In questi tipi di progetti, è necessario eseguire il cast in modo esplicito della proprietà Cells a un Range. In questo esempio viene richiesto un progetto Excel a livello di documento con una classe del foglio di lavoro denominata Sheet1.

Dim castRange As Excel.Range = CType(Globals.Sheet1.Cells(1, 1), Excel.Range)
Excel.Range castRange = (Excel.Range)Globals.Sheet1.Cells[1, 1];

Nell'esempio di codice seguente viene dimostrato come eseguire in modo implicito il cast di un oggetto a un tipo specifico in un progetto di Visual Basic dove Option Strict non è attiva o in un progetto di Visual C# che ha .NET Framework 4 come destinazione. In questi tipi di progetti, viene eseguito il cast in modo implicito della proprietà Cells a un Range. In questo esempio viene richiesto un progetto Excel a livello di documento con una classe del foglio di lavoro denominata Sheet1.

Dim dynamicRange As Excel.Range = Globals.Sheet1.Cells(1, 1)
Excel.Range dynamicRange = Globals.Sheet1.Cells[1, 1];

Accesso ai membri disponibili solo tramite associazione tardiva

Alcune proprietà e metodi negli assembly di interoperabilità primari di Office sono disponibili solo tramite associazione tardiva. Nei progetti di Visual Basic dove Option Strict è attiva o nei progetti di Visual C# che hanno .NET Framework 4 come destinazione, è possibile utilizzare le funzionalità di associazione tardiva in questi linguaggi per accedere ai membri associati in modo tardivo. Nei progetti di Visual Basic dove Option Strict è attiva o nei progetti di Visual C# che hanno .NET Framework 3.5 come destinazione, è necessario utilizzare la reflection per accedere a questi membri.

Esempi

Nell'esempio di codice seguente viene dimostrato come accedere ai membri associati in modo tardivo in un progetto di Visual Basic dove Option Strict non è attiva o in un progetto di Visual C# che ha .NET Framework 4 come destinazione. In questo esempio viene eseguito l'accesso alla proprietà Name associata in modo tardivo della finestra di dialogo Apri file in Word. Per utilizzare questo esempio, eseguirlo dalla classe ThisDocument o ThisAddIn del progetto Word.

Private Sub TestDynamicDialog()
    Dim dialog As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
    dialog.Name = "Testing"
    dialog.Show()
    MessageBox.Show(dialog.Name)
End Sub
dynamic dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
dialog.Name = "Testing";
dialog.Show();
MessageBox.Show(dialog.Name);

Nell'esempio di codice seguente viene dimostrato come utilizzare la reflection per eseguire la stessa attività in un progetto di Visual Basic dove Option Strict è attiva o in un progetto di Visual C# che ha .NET Framework 3.5 come destinazione.

Dim dlg As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
Dim dlgType As Type = GetType(Word.Dialog)

' Set the Name property of the dialog box.
dlgType.InvokeMember("Name", _
    Reflection.BindingFlags.SetProperty Or _
        Reflection.BindingFlags.Public Or _
        Reflection.BindingFlags.Instance, _
    Nothing, dlg, New Object() {"Testing"}, _
    System.Globalization.CultureInfo.InvariantCulture)

' Display the dialog box.
dlg.Show()

' Show the Name property.
MessageBox.Show(dlgType.InvokeMember("Name", _
    Reflection.BindingFlags.GetProperty Or _
        Reflection.BindingFlags.Public Or _
        Reflection.BindingFlags.Instance, _
    Nothing, dlg, Nothing, _
    System.Globalization.CultureInfo.InvariantCulture))
Word.Dialog dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
System.Type dialogType = typeof(Word.Dialog);

// Set the Name property of the dialog box.
dialogType.InvokeMember("Name", 
    System.Reflection.BindingFlags.SetProperty | 
        System.Reflection.BindingFlags.Public | 
        System.Reflection.BindingFlags.Instance,
    null, dialog, new object[] { "Testing" },
    System.Globalization.CultureInfo.InvariantCulture);

// Display the dialog box.
dialog.Show(ref missing); 

// Show the Name property.
MessageBox.Show(dialogType.InvokeMember("Name",
    System.Reflection.BindingFlags.GetProperty |
        System.Reflection.BindingFlags.Public |
        System.Reflection.BindingFlags.Instance,
    null, dialog, null,
    System.Globalization.CultureInfo.InvariantCulture).ToString());

Vedere anche

Riferimenti

Istruzione Option Strict

Reflection (C# e Visual Basic)

Concetti

Scrittura di codice nelle soluzioni Office

Parametri facoltativi nelle soluzioni Office

Altre risorse

Utilizzo del tipo dinamico (Guida per programmatori C#)

Progettazione e creazione di soluzioni Office