Создание COM индексированного свойства из C #? - PullRequest
8 голосов
/ 06 мая 2011

Я пытаюсь имитировать старый dll vb6 с новым .net.Мимикрия должна быть идеальной, чтобы вызывающие абоненты не знали, что они используют новый .dll.

Хотя у меня есть любопытство.В VB6 в библиотеке объектов есть следующее:

Property BankList(Index As Long) As String

Но свойство AFAIK этого нельзя сделать в .net?

Самое близкое, что я могу получить, - это создать функцию, которая показываетэто поведение, но затем тип COM переходит от свойства к методу.

Кто-нибудь может подсказать, как мне создать эту подпись со свойством?

Ответы [ 4 ]

4 голосов
/ 06 мая 2011

Вы можете украсить обычный индексатор атрибутом IndexerNameAttribute, чтобы предоставить ему имя для других языков. Хотя я не уверен, что это достигнет вашей цели.

К сожалению, C # поддерживает только вызов именованных индексаторов как часть взаимодействия COM, нет поддерживаемого языкового способа реализации вашего собственного (т. Е. Класс может иметь только индексатор по умолчанию с IndexerNameAttribute атрибут).

Вы можете создать нечто, похожее на вызывающие в C #, реализовав тип с индексатором, а затем имея свойство этого типа, но оно не будет точно отображено в VB6-эквиваленте, который вам нужен.

См. Также: Использование индексаторов (C #)

Помимо
Как уже упоминалось в других ответах, хотя C # не поддерживает именованные индексаторы, .NET CLR и некоторые другие языки, такие как VB.NET, поддерживают. Возможно, вы захотите изменить свой целевой язык, чтобы получить эту функцию.

2 голосов
/ 06 мая 2011

Именованные параметризованные свойства не могут быть созданы в C # (доступно только одно свойство по умолчанию, называемое this).

Существует несколько вариантов:

  • Изменитьинтерфейс (но это упускает из виду то, что клиентский код нужно будет изменить).
  • Используйте VB (.net), который может создавать такие свойства.
  • Создайте адаптер в C ++, чтобы дать полный контрольна уровне COM.

Первое означает изменение интерфейса, что нарушает ваши требования.Последний вариант дает больше контроля, но значительно сложнее (если вы не знаете, как разрабатывать C ++ COM).Я бы пошел с VB.NET.

2 голосов
/ 06 мая 2011

Согласно http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx вы не можете объявить индексированные свойства в C #. Однако, в отличие от того, что утверждают некоторые другие ответы, CLR поддерживает их, и вы можете объявить их в VB.NET.

1 голос
/ 06 мая 2011

Индексированные свойства доступны в .Net / C #, но вы не можете назвать их:

public String this[long index]
{
    get; set;
}

Это делает свойство с именем Item, но вы не используете это имя в C #:

myObj[1L];

Если вы хотите вызвать именованное свойство в COM с C # 4.0, вы можете:

excel.Range["a"];

http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx

Наконец, если вы хотитечтобы иметь именованный индекс для языков COM, вы можете использовать IndexerNameAttribute , чтобы представить индексатор как именованное свойство.

...