У меня есть куча словаря (Integer, SomeClass) в моем основном классе, который я использую AutoDual для COM. Пользователи должны перебрать экземпляры в VBA (Excel специально), так что у меня есть куча из них это в моем главном классе ...IEnumerable видна в COM, но не ICollection?
Public ReadOnly Property Inflations() As IEnumerable
Get
Return InflationsDict.Values
End Get
End Property
я могу использовать это в моем коде VBA, как это ...
For Each I In CP.Inflations...
Но это не поддерживает граф. Словари разоблачить ICollection, а также, который имеет .Count, но когда я сделал это единственное изменение ...
Public ReadOnly Property Inflations() As ICollection
метод исчезает из COM, и тот же для каждого становится «Ошибка выполнения 438 Объект не поддерживайте это свойство или метод ». Он продолжает отлично работать на VB.net.
Мне сказали, что основным правилом является то, что не-generics должны экспортировать ОК. Во время компиляции ничего не возникает - тогда, когда я пытался экспортировать IEnumerable(Of Inflation)
на жаворонку, наверняка на выходе появится предупреждение.
Есть ли боковая панель правила, которое применяется в этом случае?
Хорошо, я * думаю * я понимаю, что здесь происходит. К счастью, у меня есть идеальный класс, чтобы связать это, словари фактически изолированы в табличной конструкции, которая делает это простым. Но вопрос о наследовании ... как правило, имеет наследование интерфейса * не * выставлять унаследованные методы? Или есть немного хитрости к этому? –
Существует несколько проблем, но основная проблема заключается в том, что существует много COM-клиентов, которые не поддерживают класс с несколькими интерфейсами. Они могут использовать только [ComDefaultInterface] и не имеют способа попросить другого. Ограничение на языках сценариев, VBA, VB6, у них вообще нет понятия интерфейсов. Технический обходной путь для этого состоит в том, чтобы выставить два члена, один из которых возвращает ICollection, а другой - для возврата IEnumerable. Не красиво. –
Что заставляет меня беспокоиться, что, возможно, я был в тупике с интерфейсами, но я реализовал это, и я немного поиграл, чтобы понять, что это делает для общего API в тех программах, которые его потребляют. –