vb.net - 什么是 Office.Tools.Ribbon.RibbonControlImpl?
问题描述
我正在构建一个小助手来获取和填充集合内功能区组的所有控件。
Option Strict On
Imports Microsoft.Office.Tools.Ribbon
Private Function GetChildControls(Group As RibbonGroup) As IEnumerable(Of RibbonControl)
Dim ChildControls As New List(Of RibbonControl)
Dim SubControls As IEnumerable(Of RibbonControl) = Group.Items
ChildControls.AddRange(SubControls)
' ...
' Some recursive call over SubControls to get the children of each child (not relevant here)
' ...
Return ChildControls
End Function
代码在 处中断ChildControls.AddRange(SubControls)
,但有以下例外:
System.InvalidCastException:'无法将 Microsoft.Office.Tools.Ribbon.RibbonControl[] 类型的对象转换为 Microsoft.Office.Tools.Ribbon.RibbonControlImpl[]'。
我根本找不到任何参考RibbonControlImpl
。Microsoft 文档是沉默的,而且 - 令人惊讶的是 - Google或StackOverflow也是如此。
更改ChildControls.AddRange(SubControls)
为SubControls.ToList.ForEach(Sub(p) ChildControls.Add(p))
也不起作用,但经典For Each
可以解决问题:
For Each MySubControl As RibbonControl In SubControls
ChildControls.Add(MySubControl)
Next
我想了解这里发生了什么?接口类型的后缀是否Impl
表示某些东西?也许'Impl'代表'实施'?我也找不到这方面的任何信息。
解决方案
只是一些想法,不知道我是否正确;你怎么看?
Office.Ribbon.RibbonControl
是互操作接口,因此不能用作跨程序集的泛型类型。猜测是微软实现了一个非互操作RibbonControlImp
包装器,RibbonControl
每次它被引用为泛型类型时都会隐式地转换为该包装器。
不知道如何实现这一点,但这可以解释为什么For Each ... Next
不抛出错误,而依赖泛型集合会。
推荐阅读
- flutter - 如何从 Cloud Firestore 获取具有特定条件的集合的文档
- javascript - Javascript .push 方法返回错误
- javascript - React HOC 查询 graphql
- python - 使用python在具有特定名称的列中选择多个值进行绘图
- r - 使用 cairo_pdf 设备时的字体间距
- azure - Azure - 为存储容器中的每个新 blob 触发 Databricks 笔记本
- elasticsearch - Elasticsearch - 如何过滤嵌套对象列表
- c - C中字符常量的值
- java - 拆分url字符串时如何使用LinkedHashMap创建键值对?
- r - 向上添加列计数,直到另一列中的值发生变化