Использование .NET Generics для хранения ArcObjects?

11

Каковы последствия использования универсальных типов в .NET для хранения объектов ArcObject, таких как ILayer, IField и т. Д.?

Компилятор выдает мне предупреждение при использовании таких значений

public class Foo
{
    private List<ILayer> fooLayers;

    public List<ILayer> FooLayers
    {
        get { ... }
        set { ... }
    }
}

Вот предупреждение:

Предупреждение 15 Обработка предупреждений экспортера библиотеки типов «ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore». Предупреждение: экспортер библиотеки типов обнаружил экземпляр универсального типа в подписи. Общий код не может быть экспортирован в COM. ArcMemorialCore

Меня беспокоит не только наличие предупреждения, но и хорошие методы проектирования, производительность и т. Д.

Джордж Сильва
источник
Какое предупреждение вы получаете?
Рид Копси
4
Пожалуйста, добавьте некоторый контекст к вашему вопросу тоже. Нам нужно больше узнать о том, как вы используете объекты. Насколько я знаю, нет никаких внутренних проблем с использованием классов или интерфейсов ArcObjects, подобных этому.
Кит Дж
Что говорится в предупреждениях?
Уго Эстрада
Вы получаете сообщение об ошибке или предупреждение?
Джей Камминс
Предупреждение. Компилируется просто отлично. Мои интересы выходят за рамки предупреждения. Это больше касается производительности, хороших методов проектирования и т. Д. Предупреждение: Предупреждение 15 Обработка предупреждений экспортера библиотеки типов 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Предупреждение: экспортер библиотеки типов обнаружил экземпляр универсального типа в подписи. Общий код не может быть экспортирован в COM.
Джордж Сильва

Ответы:

10

Вы получили предупреждение, потому что ваш класс (или сборка) помечен:

[ComVisible(true)]

Это заставляет компилятор выдавать предупреждения, когда вы используете типы, несовместимые с COM-объектами.

При этом нет проблем с использованием обобщенных типов с типами ArcObject. Однако вы должны использовать их только для типов, которые являются внутренними для вашего приложения, т. Е. Когда вы работаете с набором значений.

Рид Копси
источник
В добавление к этому, я считаю, что для COM + проблема состоит только в том, чтобы сослаться, например, на имя общего типа List<object>. Переход с CLR на COM + не должен быть проблемой.
Денди
1
Вы можете избежать такого рода предупреждений, пометив свое свойство как [ComVisible (false)], в то же время позволяя классу (или всей сборке, что не рекомендуется в .NET 2.0+) помечать как [ComVisible (true)].
Петр Кребс
2

У меня нет проблем с его компиляцией.

Я использую C # 3.5

using System; 
using System.Collections.Generic; 
using System.Web;
using ESRI.ArcGIS.Carto;  //Perhaps not having this reference is the issue?

public class Foo
    {
        private List<ILayer> _fooLayers;

        public List<ILayer> FooLayers
        {
            get { return _fooLayers; }
            set { _fooLayers = value; }
        }
    }
Шон Дойч
источник