如何:在 COM 互操作编程中使用索引属性(C# 编程指南)

索引属性改进了在 C# 编程中使用具有参数的 COM 属性的方式。将索引属性与 Visual C# 2010 中引入的其他功能(如命名参数和可选参数、新的 dynamic 类型以及嵌入的类型信息)一起使用,可增强 Microsoft Office 编程功能。

在早期版本的 C# 中,只有在 get 方法不具有任何参数且 set 方法有且仅有一个值参数时,才能将方法作为属性进行访问。但是,并非所有 COM 属性都符合上述限制。例如,Excel 的 Range 属性具有一个 get 访问器,该访问器需要一个表示范围名称的参数。以前,由于您无法直接访问 Range 属性,因此您必须改用 get_Range 方法,如以下示例所示。

// Visual C# 2008 and earlier.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);

利用索引属性,您可以改为编写以下代码:

// Visual C# 2010.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.Range["A1"];
注意
上面的示例还使用可选参数功能(在 Visual C# 2010 中引入),此功能可使您忽略 Type.Missing

与此类似,若要在 Visual C# 2008 及更早版本中设置 Range 对象的 Value 属性的值,需要两个参数。一个参数为用于指定范围值的类型的可选形参提供实参。另一个参数提供 Value 属性的值。在 Visual C# 2010 之前的版本中,C# 仅允许一个参数。因此,您必须使用 set_Value 方法,或者使用另一个属性 Value2,而不能使用常规的 set 方法。下面的示例演示了这些技术。这两种技术都将 A1 单元格的值设置为 Name。

// Visual C# 2008.
targetRange.set_Value(Type.Missing, "Name");
// Or
targetRange.Value2 = "Name";

利用索引属性,您可以改为编写以下代码。

// Visual C# 2010.
targetRange.Value = "Name";

您不能创建自己的索引属性。该功能只支持使用现有的索引属性。

下面的代码显示一个完整的示例。有关如何设置访问 Office API 的项目的更多信息,请参见如何:通过使用 Visual C# 功能访问 Office 互操作对象(C# 编程指南)

// You must add a reference to Microsoft.Office.Interop.Excel to run 
// this example.
using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace IndexedProperties
{
    class Program
    {
        static void Main(string[] args)
        {
            CSharp2010();
            //CSharp2008();
        }

        static void CSharp2010()
        {
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add();
            excelApp.Visible = true;

            Excel.Range targetRange = excelApp.Range["A1"];
            targetRange.Value = "Name";
        }

        static void CSharp2008()
        {
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add(Type.Missing);
            excelApp.Visible = true;

            Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);
            targetRange.set_Value(Type.Missing, "Name");
            // Or
            //targetRange.Value2 = "Name";

        }
    }
}

请参阅

命名实参和可选实参(C# 编程指南)

dynamic(C# 参考)

使用类型 dynamic(C# 编程指南)

如何:在 Office 编程中使用命名参数和可选参数(C# 编程指南)

如何:通过使用 Visual C# 功能访问 Office 互操作对象(C# 编程指南)

演练:Office 编程(C# 和 Visual Basic)