什么是Office.Tools.Ribbon.RibbonControlImpl?

问题描述 投票:0回答:1

我正在构建一个小的帮助程序来获取并填充集合中功能区组的所有控件。

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 documentation是无声的,而且-[令人惊讶的是-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.net vsto office-interop
1个回答
0
投票

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

Office.Ribbon.RibbonControl是互操作接口,因此cannot be used as a generic type across assemblies。一种猜测是,Microsoft实现了一个非互操作的RibbonControlImp包装器,每次将其作为泛型类型引用时,都会隐式地将RibbonControl强制转换为该包装。]

不知道如何实现,但这可以解释为什么For Each ... Next不会在依赖通用集合的情况下引发错误,而会抛出错误。

© www.soinside.com 2019 - 2024. All rights reserved.