Есть коллекция, которая может использоваться как скриптовыми языками 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 компилятор сделает коллекцию нетипизированной