首页 > 解决方案 > 什么是 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[]'。

我根本找不到任何参考RibbonControlImplMicrosoft 文档是沉默的,而且 - 令人惊讶的是 - GoogleStackOverflow也是如此。

更改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'代表'实施'?我也找不到这方面的任何信息。

标签: vb.netvstooffice-interop

解决方案


只是一些想法,不知道我是否正确;你怎么看?

Office.Ribbon.RibbonControl是互操作接口,因此不能用作跨程序集的泛型类型。猜测是微软实现了一个非互操作RibbonControlImp包装器,RibbonControl每次它被引用为泛型类型时都会隐式地转换为该包装器。

不知道如何实现这一点,但这可以解释为什么For Each ... Next不抛出错误,而依赖泛型集合会。


推荐阅读