Типизированная коллекция сразу для COM Interop и CLR
От: baranovda Российская Империя  
Дата: 22.06.13 09:46
Оценка:
Есть коллекция, которая может использоваться как скриптовыми языками WSH (VBScript, JScript), так и CLR-совместимыми.

Для того, чтобы из VBS звался For Each, то как гласят все руководства, мне надо отнаследовать коллекцию от System.Collections.IEnumerable.

Это работает, но при итерации по коллекции из кода C# не видна типизация возвращаемого элемента — возвращается Object, не работает Autocomplete и т.п.

Если же отнаследовать интерфейс коллекции от System.Collections.Generic.IEnumerable<T>, то все наоборот — коллекция становится строго типизированной, в редакторе работает автокомплит, но — при обращении к коллекции из COM _NewEnum не работает.

Сама коллекция разделена на интерфейс и реализацию кокласса

[ComVisible(true)]
[Guid("")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IMyCollection : IEnumerable<IMyItem>
{
  // Строка 1
  IEnumerator<IMyItem> GetEnumerator(); // Этот метод нужен для .NET

  // Строка 2
  new IEnumerator          GetEnumerator(); // А этот метод нужен для COM CRW
}

[ComVisible(true)]
[Guid("")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IMyCollection))]
public class MyCollectionImpl : IMyCollection
{
}


Проблемное место выделил жирным.

Два метода с одним именем понятное дело держать нельзя

Удалить строку 2 я не могу, иначе а) не будет работать foreach из COM б) существует известный ньюанс
Автор: baranovda
Дата: 18.06.13
при разработке COM-компонентов для Interop в .NET, использующих наследование, поэтому я вынужден оставить строку 2 в определении интерфейса

Удалить из определения интерфейса строку 1 тоже нельзя, потому что при наличии строки 2 компилятор сделает коллекцию нетипизированной
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.