索引属性可改善有参数的COM属性在C#编程中的使用方式。索引属性与命名参数和可选参数、一个新类(动态类)和嵌入式类型信息等Visual C# 2010中推出的其它属性一起工作以增强微软Office编程。
在早期版本的C#中,只要Get方式没有参数和Set方式只有一个参数和唯一的一个值参数,方式就可以作为属性访问。然而,并非所有的COM属性都能够满足这些严格的限制。例如,Excel Range属性有一个Get访问器,需要为这个Range的名称提供一个参数。在过去,由于你不能直接访问这个Range属性,你必须使用get_Range方式,如下面的例子所示:
C#
// Visual C# 2008 and earlier.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.get_Range("A1", Type.Missing);
索引属性能够让你写如下代码:
C#
// Visual C# 2010.
var excelApp = new Excel.Application();
// . . .
Excel.Range targetRange = excelApp.Range["A1"];
备注:上面的例子还使用了Visual C# 2010中推出的可选参数功能。这个功能可以让你删除Type.Missing。
同样,要设置Visual C# 2008和更早版本中的一个Range(范围)对象的值属性的值,需要两个参数。一个是提供指定这个Range值类型的可选参数的一个参数。另一个是提供这个值属性的值的参数。在Visual C# 2010之前,C#仅允许一个参数。因此,不使用一个正常的Set方式,你必须使用set_Value方式或者使用一个不同的属性Value2。下面的例子说明了这些技术。这两种方法都把A1单元的值设置为“Name”。
C#
// Visual C# 2008.
targetRange.set_Value(Type.Missing, "Name");
// Or
targetRange.Value2 = "Name";
索引属性能够让你编写如下代码代替:
C#
// Visual C# 2010.
targetRange.Value = "Name";
你不能创建你自己的索引属性。这个功能仅支持现有的索引属性的消耗。
例子
下面的代码显示了一个完整的例子。要了解更多的有关如何设置一个访问Office API的项目,参见“技巧:使用Visual C# 2010功能访问Office互操作对象”(C#编程指南)。网址是:http://msdn.microsoft.com/en-us/library/dd264733(VS.100).aspx
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";
}
}
}