【问题标题】:Excel COM interop - why are return types often dynamic?Excel COM 互操作 - 为什么返回类型通常是动态的?
【发布时间】:2018-09-04 10:10:45
【问题描述】:

这可能是个愚蠢的问题,但我正在使用 Microsoft 的 Office/Excel 互操作类型库。

我注意到许多返回类型是“动态”类型的;例如,

Excel.Workbook wb = ...;
var ws = wb.ActiveSheet;

ws 将是“动态的”,而不是作为“Excel.Worksheet”返回 - 但这是为什么呢?

我看到了动态类型 COM 对象在类型库不可用的情况下的好处,但在这种情况下,它是可用的。

那么为什么要在这里动态输入呢?

我现在唯一能想到的可能是嵌入互操作类型时会发生什么,然后例如.Worksheet 属性是通过反射访问的,所以它的类型不是嵌入的,但需要访问。但这是一个疯狂的猜测。不得不手动转换这么多类型的麻烦似乎很大,所以我认为这背后一定有一些相当重要的设计决策

【问题讨论】:

  • Office 互操作对象模型是在大约 20 年前以其当前形式设计的。它持续了这么长时间是一项令人惊叹的工程壮举。他们使用的技巧之一是不确定类型,让他们有余地,在这种情况下,返回其他东西。 20 年前问题不大,客户端语言在后期绑定方面几乎没有问题。在 C# 中也不再存在太大问题,在版本 4 中添加 dynamic 在很大程度上是为了更好地支持 Office 编程。以前挺惨的。
  • 我明白了,谢谢汉斯。因此,更多的是遗留原因,而不是基于当前设计要求的任何原因。可能会考虑以某种方式将其包装到一个自定义类型类中,然后直接进行转换
  • 支持KISS。只需 var ws = (Excel.WorkBook)wb.ActiveSheet;
  • 感谢您的意见!这确实是我的主要动机,尽管以不同的方式 - 仅在 C# 中开发类似 Excel 的 VBA 编辑器的东西。理想情况下希望用户轻松编写脚本 - 如果他们需要自己转换所有内容,可能会令人困惑..所以也许我会创建一个简单的包装器类型。
  • 我建议您通过您自己的一组自定义接口来包装互操作模型。这样,除了能够对项目进行单元测试外,您还可以(如果需要)强类型化 COM 对象成员。

标签: c# excel com


【解决方案1】:

来自here

在编译时,假定类型为动态的元素 支持任何操作。因此,您不必担心 关于对象是否从 COM API、动态 来自 HTML 文档对象模型的语言,例如 IronPython (DOM),来自反射,或来自程序中的其他地方。 但是,如果代码无效,则会在运行时捕获错误。

.....

动态对象和其他类型之间的转换很容易。这 使开发人员能够在动态和非动态之间切换 行为。

.....

许多 COM 方法允许参数类型和返回类型的变化 通过将类型指定为对象。这需要明确 转换值以与强类型变量协调 C#。如果您使用 /link(C# 编译器选项)选项进行编译, 动态类型的引入使您能够处理 COM 签名中对象的出现,就好像它们是类型一样 动态的,从而避免了大部分的演员阵容。

【讨论】:

  • 谢谢!我不太确定我是否理解。第一段似乎更像是对动态类型的一般描述——如果我引用了一个 Excel COM 对象,它的任何返回类型(例如工作表中的工作簿或类似的)真的可以是非 COM 对象吗?
  • 不知道下面是不是起点。我会回到这个...fernandof.wordpress.com/2008/02/05/…
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多