Office 解决方案中的后期绑定
Office 应用程序的对象模型中的某些类型提供了可通过后期绑定功能使用的功能。 例如,某些方法和属性可以根据 Office 应用程序的上下文返回不同类型的对象,而某些类型可以在不同的上下文中公开不同的方法或属性。
**适用于:**本主题中的信息适用于 Microsoft Office 2010 和 2007 Microsoft Office system 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
Option Strict 处于关闭状态的 Visual Basic 项目和面向 .NET Framework 4 的 Visual C# 项目可直接使用采用这些后期绑定功能的类型。 Option Strict 处于打开状态的 Visual Basic 项目和面向 .NET Framework 3.5 的 Visual C# 项目必须使用强制转换或反射才能使用这些类型。
对象返回值的隐式和显式强制转换
Microsoft Office 主互操作程序集 (PIA) 中的许多方法和属性都返回 Object 值,因为它们能够返回一些不同类型的对象。 例如,ActiveSheet 属性返回 Object,因为其返回值可以为 Worksheet 或 Chart 对象,具体情况视活动工作表而定。
当方法或属性返回 Object 时,您必须将对象显式转换(在 Visual Basic 中)或强制转换(在 C# 中)为 Option Strict 处于打开状态的 Visual Basic 项目和面向 .NET Framework 3.5 的 Visual C# 项目中的正确类型。 对于 Option Strict 处于关闭状态的 Visual Basic 项目和面向 .NET Framework 4 的 Visual C# 项目,您不必显式强制转换这些项目中的 Object 返回值。
大多数情况下,参考文档为返回 Object 的成员列出了返回值的可能类型。 通过转换或强制转换对象,可以在代码编辑器中为该对象启用 IntelliSense 功能。
有关在 Visual Basic 中转换的信息,请参见隐式转换和显式转换 (Visual Basic)和 CType 函数 (Visual Basic)。 有关在 Visual C# 中进行强制转换的信息,请参见强制转换和类型转换(C# 编程指南)和 () 运算符(C# 参考)。
示例
下面的代码示例演示如何将对象强制转换为 Option Strict 处于打开状态的 Visual Basic 项目或面向 .NET Framework 3.5 的 Visual C# 项目中的特定类型。 在这些类型的项目中,您必须将 Cells 属性显式强制转换为 Range。 此示例需要一个带有名为 Sheet1 的工作表类的文档级 Excel 项目。
Dim castRange As Excel.Range = CType(Globals.Sheet1.Cells(1, 1), Excel.Range)
Excel.Range castRange = (Excel.Range)Globals.Sheet1.Cells[1, 1];
下面的代码示例演示如何将对象隐式强制转换为 Option Strict 处于关闭状态的 Visual Basic 项目或面向 .NET Framework 4 的 Visual C# 项目中的特定类型。 在这些类型的项目中,Cells 属性将隐式强制转换为 Range。 此示例需要一个带有名为 Sheet1 的工作表类的文档级 Excel 项目。
Dim dynamicRange As Excel.Range = Globals.Sheet1.Cells(1, 1)
Excel.Range dynamicRange = Globals.Sheet1.Cells[1, 1];
访问只能通过后期绑定使用的成员
Office PIA 中的某些属性和方法只能通过后期绑定使用。 在 Option Strict 处于关闭状态的 Visual Basic 项目或面向 .NET Framework 4 的 Visual C# 项目中,您可以使用这些语言中的后期绑定功能来访问后期绑定的成员。 在 Option Strict 处于打开状态的 Visual Basic 项目或面向 .NET Framework 3.5 的 Visual C# 项目中,您必须使用反射来访问这些成员。
示例
下面的代码示例演示如何在 Option Strict 处于关闭状态的 Visual Basic 项目或面向 .NET Framework 4 的 Visual C# 项目中访问后期绑定的成员。 此示例访问 Word 中**“打开文件”**对话框的后期绑定 Name 属性。 若要使用此示例,请从 Word 项目内的 ThisDocument 或 ThisAddIn 类中运行此示例。
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);
下面的代码示例演示如何使用反射在 Option Strict 处于打开状态的 Visual Basic 项目或面向 .NET Framework 3.5 的 Visual C# 项目中完成相同任务。
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());