我目前正在撰写有关动态类型的文章,并给出了 Excel 互操作的示例。我以前几乎没有做过任何 Office 互操作,这表明了这一点。这MSDN Office 互操作教程对于 C# 4 使用_Worksheet
界面,但还有一个Worksheet
界面。我不知道有什么区别。
在我的极其简单的演示应用程序(如下所示)中,两者都可以正常工作 - 但如果最佳实践决定其中之一,我宁愿适当地使用它。
using System;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
class DynamicExcel
{
static void Main()
{
var app = new Excel.Application { Visible = true };
app.Workbooks.Add();
// Can use Excel._Worksheet instead here. Which is better?
Excel.Worksheet workSheet = app.ActiveSheet;
Excel.Range start = workSheet.Cells[1, 1];
Excel.Range end = workSheet.Cells[1, 20];
workSheet.get_Range(start, end).Value2 = Enumerable.Range(1, 20)
.ToArray();
}
}
我试图避免对 COM 或 Office 互操作性进行全面深入的研究,只是强调 C# 4 的新功能 - 但我不想做任何非常非常愚蠢的事情。
(上面的代码中也可能有一些非常非常愚蠢的东西,在这种情况下请让我知道。使用单独的开始/结束单元而不是仅仅“A1:T1”是故意的 - 更容易看出它确实是一个范围20 个细胞。其他任何情况都可能是偶然的。)
那么,我应该使用_Worksheet
or Worksheet
,为什么?
如果我没记错的话——我对此的记忆有点模糊,自从我拆开Excel PIA以来已经很长时间了——它是这样的。
事件本质上是对象在发生某事时调用的方法。在 .NET 中,事件是委托,简单明了。但在 COM 中,将一大堆事件回调组织到接口中是很常见的。因此,给定对象上有两个接口 - “传入”接口,您希望其他人调用您的方法,以及“传出”接口,您希望在事件发生时调用其他人的方法。
在非托管元数据(类型库)中,对于可创建对象,定义了三件事:传入接口、传出接口和组件类,它表示“我是一个可创建对象,它实现了此传入接口,并且输出接口”。
现在,当类型库自动转换为元数据时,遗憾的是,这些关系被保留了。如果有一个手工生成的 PIA,使类和接口更符合我们在托管世界中的期望,那就更好了,但遗憾的是,这并没有发生。因此,Office PIA 充满了这些看似奇怪的重复,其中每个可创建的对象似乎都有两个与之关联的接口,并且它们上有相同的东西。其中一个接口代表组件类的接口,其中之一代表该组件类的传入接口。
_Workbook 接口是工作簿组件类上的传入接口。 Workbook 接口是代表组件类本身的接口,因此继承自_Workbook。
长话短说,如果可以方便的话,我会使用 Workbook; _Workbook 是一些实现细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)