【发布时间】: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 对象成员。