Usando o .NET Generics para armazenar ArcObjects?


11

Quais são as implicações do uso de tipos genéricos no .NET para armazenar ArcObjects, como ILayer, IField, etc?

O compilador lança um aviso ao usar esse tipo de valores

public class Foo
{
    private List<ILayer> fooLayers;

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

Aqui está o aviso:

Aviso 15 Processamento de aviso do exportador da biblioteca de tipos 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Aviso: o exportador da biblioteca de tipos encontrou uma instância de tipo genérico em uma assinatura. Código genérico não pode ser exportado para COM. ArcMemorialCore

Minha preocupação não é apenas a existência do aviso, mas também as boas práticas de design, desempenho etc.


Que aviso você está recebendo?
Reed Copsey

4
Adicione também algum contexto à sua pergunta. Precisamos saber mais sobre como você está usando os objetos. Até onde eu sei, não há problemas inerentes ao uso de classes ou interfaces do ArcObjects como esta.
Keith G

O que dizem os avisos?
Hugo Estrada

Você está recebendo um erro ou um aviso?
Jay Cummins

Atenção. Compila muito bem. Meus interesses estão além da existência do aviso. É mais uma preocupação em termos de desempenho, boas práticas de design etc. O aviso é: Aviso 15 Processamento de aviso do exportador da biblioteca de tipos 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (valor), ArcMemorialCore'. Aviso: o exportador da biblioteca de tipos encontrou uma instância de tipo genérico em uma assinatura. Código genérico não pode ser exportado para COM.
George Silva

Respostas:


10

O aviso que você recebeu é porque você tem sua classe (ou montagem) marcada com:

[ComVisible(true)]

Isso faz com que o compilador emita avisos quando você usa tipos que não são compatíveis com objetos COM.

Dito isto, não há problema em usar genéricos com tipos de ArcObject. No entanto, você deve usá-los apenas para tipos internos ao seu aplicativo - ou seja, quando estiver trabalhando com um conjunto de valores.


Além disso, acredito que é apenas um problema para o COM + se referir a um nome de tipo genérico, por exemplo List<object>. Ir do CLR para o COM + não deve ser um problema.
Dandy

1
Você pode evitar esse tipo de aviso marcando sua propriedade como [ComVisible (false)] enquanto ainda permite que a classe (ou todo o assembly, que não é uma prática recomendada no .NET 2.0+) seja marcada como [ComVisible (true)].
Petr Krebs


2

Não tenho problemas para compilar.

Eu estou usando 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; }
        }
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.