我正在构建一个小的帮助程序来获取并填充集合中功能区组的所有控件。
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是无声的,而且-[令人惊讶的是-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
是互操作接口,因此cannot be used as a generic type across assemblies。一种猜测是,Microsoft实现了一个非互操作的RibbonControlImp
包装器,每次将其作为泛型类型引用时,都会隐式地将RibbonControl
强制转换为该包装。]
不知道如何实现,但这可以解释为什么For Each ... Next
不会在依赖通用集合的情况下引发错误,而会抛出错误。