C # выставление класса для COM - Общие коллекции - PullRequest
3 голосов
/ 07 декабря 2009

У нас есть небольшой фреймворк, написанный на C # .Net 2.0, который мы хотим представить в COM.

Проблема в том, что у нас есть несколько общих классов, которые будут представлены следующим образом:

interface IOurClass
{
  ReadonlyCollection<IOurListObject> OurCollection
  {
    get;
  }
}

interface IOurListObject
{
  //Some properties that don't matter
}

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

Мы также хотели бы избежать написания нового класса для каждой используемой нами коллекции, но это может оказаться невозможным.

Ответы [ 2 ]

7 голосов
/ 07 декабря 2009

Невозможно предоставить универсальные коллекции (или любые другие «общие») для COM.

Итак, я предлагаю вам создать неуниверсальное свойство (или метод) в вашем видимом COM-интерфейсе. Этот метод может вернуть массив элементов IOurListObject. В вашем классе вы могли бы реализовать этот метод явно, чтобы он не отображался в вашем intellisense, например, когда вы обращаетесь к объекту непосредственно вне COM.

Надеюсь, я немного проясню.

Пример:

[ComVisible(true)]
public interface IOurClass
{
    IOurListObject[] OurCollection { get; }
}

public class OurClass : IOurClass
{
    IOurListObject[] IOurClass.OurCollection { get { return OurCollection.ToArray();} }

    public ReadOnlyCollection<IOurListObject> OurCollection { ... }
}
2 голосов
/ 07 декабря 2009

Проверить это сообщение . Либо используйте прямой массив, либо используйте ArrayList. Похоже, шаг назад, но общие коллекции не очень хорошо работают с COM.

...