Что такое Office.Tools.Ribbon.RibbonControlImpl? - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю небольшой помощник для извлечения и заполнения всех элементов управления группы лент внутри коллекции.

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)) не тоже работает, но класс c For Each делает свое дело:

For Each MySubControl As RibbonControl In SubControls
    ChildControls.Add(MySubControl)
Next

Я хотел бы понять, что здесь происходит? Является ли Impl суффиксом типов интерфейса для обозначения чего-либо? Может быть, «Impl» означает «Реализация»? Я также не смог найти никакой информации по этому вопросу.

1 Ответ

0 голосов
/ 04 апреля 2020

Просто некоторые мысли, понятия не имею, прав ли я; как вы думаете?

Office.Ribbon.RibbonControl - это интерфейс взаимодействия, следовательно, нельзя использовать в качестве универсального c типа в сборках . Можно предположить, что Microsoft реализовала оболочку RibbonControlImp без взаимодействия, к которой RibbonControl неявно приводится каждый раз, когда на нее ссылаются как на тип c.

Не знаю, как это будет достигнуто, но это объясняет, почему For Each ... Next не выдает ошибку, а полагается на generi c collection.

...