为什么C#4.0中使用的COM库需要大量使用动态类型?

时间:2009-07-27 08:54:44

标签: c# com dynamic c#-4.0 dynamic-typing

在C#4.0演示中,我看到很多使用动态类型的代码。例如,以下代码设置Excel单元格的值:

excel.Cells [1,1] .Value = ...

但是,您也可以使用强制转换器以早期绑定的方式访问单元格:

((Range)excel.Cells [1,1])。Value = ...;

为什么Excel COM库首先只将Cell类型描述为Range类型?同样,以下方法的所有参数都是动态的:

excel.ActiveWorkbook.Charts.Add(...)

为什么论证不能是静态的?查看Excel对象模型,到处都有动态类型。这是由于COM中表达能力的限制吗?在COM库中使用动态类型而不是静态类型时是否存在模式?

3 个答案:

答案 0 :(得分:2)

COM库将此作为变体公开,这可能意味着任何数量的事情。对于使用变体做这么多事情来说,Office库真的是“错误”。

dynamic类型是最接近变体的.NET(现在它已存在),但由于向后兼容性原因,团队不希望更改tlbimp以在PIA中生成动态类型。当链接 PIA(将您使用的位构建到您自己的程序集中)而不是引用它时,您只能在C#4中获得“变体到动态”转换。

答案 1 :(得分:2)

  

在C#4.0演示中,我看到很多使用动态类型的代码。

由于dynamic是C#4.0中最大的变化之一,如果不是,我会非常惊讶。 意味着您应该立即开始使用dynamic编写所有代码 - 只需要知道可能有用的时候。

当然,方差和可选/命名参数的变化也很受欢迎 - 但是要做一个更短的演示。

从历史上看,Office(特别是)已经成为一个反对计划的猪,这对于自动化Office的人来说是一件“重要的事情。”

  • 消费COM的人(特别是Office)
  • 使用DLR类型的人(IronPython等)
  • 与动态系统(如javascript(Silverlight等))交谈的人

就我个人而言,我不希望dynamic彻底改变我在C#中编程的方式,但对某些人来说这很重要:

答案 2 :(得分:1)

实际上这是因为Office com库是用Visual Basic创建的。

您甚至可以认为整个对象层次结构是为VB创建的(没有.net的普通VB)。 VB历史上创建了这样一种方式,即使用IDispatch的com接口很简单(使用后期绑定)。

而我们现在拥有的是向后兼容的负担。