2015-05-25 3 views
1

Наша объектная модель содержит класс под названием Unit и набор этих названных Units (которые хранятся в словаре). Эти объекты имеют уникальные имена и ключи (они изначально пришли из SQL дб, что насильственного это), так что я добавил:Рабочие листы и рабочие листы (1), не могу ли я сделать это из .net-взаимодействия?

Public Units(N as String) As Unit ... 
Public Units(K as Integer) As Unit... 

, который возвращает объект единицы из коллекции единиц.

В Excel VBA можно ссылаться на большинство объектов, используя аналогичные методы; Worksheets(1) возвращает первый лист, а Worksheets("Bob") возвращает именованный лист. Но у них есть один дополнительный метод: Worksheets, который возвращает всю коллекцию. Это как если бы у них есть этот метод ...

Public Worksheets() As List(Of Worksheet) 

Но вы не можете использовать список в Interop (правильно?), так что это больше похоже ...

Public Worksheets() As ArrayList 

Так как бы я сделать тот же базовый API в .net с interop? То есть, есть три метода ...

Public Units(N as String) As Unit ... 
Public Units(K as Integer) As Unit... 
Public Units() As ArrayList... 

Как я понимаю это только первый метод заданного имени экспортируемого (это правильно?). Итак, как это делает Excel, и могу ли я подделать это в .net?

ответ

3

VBA's Worksheets - не метод. Это класс, Worksheets, который имеет default propertyItem, который принимает параметр типа Variant. Нет перегрузки (COM не поддерживает его), просто Variant может содержать как число, так и строку.

Если вам нужна аналогичная структура в VB.NET, вы можете иметь класс коллекции, который реализует default property as VB.NET understands it, и на этот раз вы можете перегрузить его.

Public Class UnitsCollection 

    Default Public ReadOnly Property Item(ByVal i As Integer) As Unit 
     Get 
      Return ... 
     End Get 
    End Property 

    Default Public ReadOnly Property Item(ByVal i As String) As Unit 
     Get 
      Return ... 
     End Get 
    End Property 

End Class 
+0

Итак, если я правильно разбор этого, вызов 'Таблицах ("Bob")' действительно вызов 'Worksheets.Item ("Bob")', и, кроме того, метод ' «Элемент» берет вариант, определяет, что было передано, и затем на основе этого основывается поиск. Правильно? Итак, что же вызывает прямолинейный «Рабочий лист»? Это вызов метода в классе? Это сборник на каком-то другом объекте, вроде, я не знаю, 'Workbook'? Когда я говорю «Рабочие книги», кого я зову? –

+0

@MauryMarkowitz Да, это правильно по методу 'Item'. Когда вы вызываете «Worksheets», вы получаете доступ к свойству «Worksheets» класса «Application», глобальному одиночному классу, представляющему сам экземпляр Excel. Это свойство называется «Worksheets» (просто имя свойства) и возвращает объект типа «Worksheets» (теперь это имя типа). – GSerg

+0

* Вы ответили, я не обновил * –

Смежные вопросы