办公室 解决方案中的后期绑定

办公室应用程序的对象模型中的某些类型提供通过后期绑定功能提供的功能。 例如,某些方法和属性可以返回不同类型的对象,具体取决于办公室应用程序的上下文,某些类型可以在不同的上下文中公开不同的方法或属性。

适用于: 本主题中的信息适用于文档级项目和 VSTO 外接程序项目。 请参阅办公室应用程序和项目类型提供的功能。

Visual Basic 项目,其中 Option Strict 处于关闭状态,而面向 .NET Framework 4 或 .NET Framework 4.5 的 Visual C# 项目可以直接处理采用这些后期绑定功能的类型。

对象返回值的隐式和显式强制转换

Microsoft 办公室主互操作程序集(PIA)中的许多方法和属性返回Object值,因为它们可以返回几种不同类型的对象。 例如,该ActiveSheet属性返回一个Object,因为它的返回值可以是或WorksheetChart对象,具体取决于活动工作表是什么。

当方法或属性返回 a Object时,您必须在 Visual Basic 项目中显式将对象转换为选项 Strict 所在的 Visual Basic 项目中的正确类型。 无需在关闭 Option StrictVisual Basic 项目中显式强制转换Object返回值。

在大多数情况下,参考文档列出了返回值 Object的成员的可能返回值类型。 转换或强制转换对象可在代码编辑器中为对象启用 IntelliSense。

有关 Visual Basic 中的转换的信息,请参阅隐式和显式转换(Visual Basic)CType 函数(Visual Basic)。

示例

下面的代码示例演示如何将对象强制转换为 Visual Basic 项目中 选项 Strict 所在的特定类型。 在此类型的项目中,必须将属性显式强制转换为 Cells .Range 此示例需要具有名为 Sheet1工作表类的文档级 Excel 项目。

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

下面的代码示例演示如何在 Visual Basic 项目中隐式将对象强制转换为特定类型,其中 Option Strict 处于关闭状态,或在面向 .NET Framework 4 的 Visual C# 项目中。 在这些类型的项目中,该 Cells 属性将隐式转换为一个 Range。 此示例需要具有名为 Sheet1工作表类的文档级 Excel 项目。

Excel.Range dynamicRange = Globals.Sheet1.Cells[1, 1];

仅通过后期绑定可用的访问成员

办公室 PIA 中的某些属性和方法只能通过后期绑定获得。 在 Visual Basic 项目中,选项 严格 处于关闭状态或面向 .NET Framework 4 或 .NET Framework 4.5 的 Visual C# 项目中,可以使用这些语言中的后期绑定功能来访问后期绑定成员。 在启用 Option StrictVisual Basic 项目中,必须使用反射来访问这些成员。

示例

下面的代码示例演示如何访问 Visual Basic 项目中的后期绑定成员,其中 Option Strict 处于关闭状态,或在面向 .NET Framework 4 的 Visual C# 项目中。 本示例访问 Word 中“文件打开”对话框的后期绑定 Name 属性。 若要使用此示例,请从 ThisDocument Word 项目中的或 ThisAddIn 类运行它。

dynamic dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
dialog.Name = "Testing";
dialog.Show();
MessageBox.Show(dialog.Name);

下面的代码示例演示如何使用反射在启用 Option Strict 的 Visual Basic 项目中完成相同的任务。

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))