Visual Studio 2010在COM互操作中使用索引属性

 索引属性可改善有参数的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";
  }
  }
  }
原文地址:https://www.cnblogs.com/Nadim/p/1702945.html