Создание COM-индексированного свойства из C #?

#c# #.net #vb6 #com-interop

#c# #.net #vb6 #com-взаимодействие

Вопрос:

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

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

 Property BankList(Index As Long) As String
  

Но AFAIK property это невозможно сделать в .net?

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

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

Комментарии:

1. Кстати, не существует такой вещи, как C#.NET . Язык называется «C #».

Ответ №1:

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

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

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

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

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

Ответ №2:

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

Ответ №3:

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

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

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

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

Комментарии:

1. К этому следует добавить еще один момент. Если вы намерены использовать C #, вы могли бы создать свою dll на C #, используя любые возможности, которые у нее есть, но затем написать небольшую «оболочку» в vb, которая поддерживает именованные параметризованные свойства и просто передает вызов в код C #. Таким образом, вы сохраняете совместимость, но при этом получаете весь новый код на C #. Лично я предпочитаю VB, поэтому, скорее всего, просто сделаю это на VB, но если вы (или команда) предпочитаете C #, это, безусловно, вариант.

Ответ №4:

Индексированные свойства доступны в .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, чтобы представить индексатор как именованное свойство.