¿Usa genéricos .NET para almacenar ArcObjects?

11

¿Cuáles son las implicaciones de usar tipos genéricos en .NET para almacenar ArcObjects, como ILayer, IField, etc.?

El compilador me arroja una advertencia al usar este tipo de valores

public class Foo
{
    private List<ILayer> fooLayers;

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

Aquí está la advertencia:

Advertencia 15 Procesador de advertencia de exportador de biblioteca de tipos 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Advertencia: el exportador de biblioteca de tipos encontró una instancia de tipo genérico en una firma. El código genérico no se puede exportar a COM. ArcMemorialCore

Mi preocupación no es solo la existencia de la advertencia, sino las buenas prácticas de diseño, rendimiento, etc.

George Silva
fuente
¿Qué advertencia estás recibiendo?
Reed Copsey
44
Agregue un poco de contexto a su pregunta también. Necesitamos saber más sobre cómo está utilizando los objetos. Hasta donde sé, no hay problemas inherentes con el uso de clases o interfaces de ArcObjects como esta.
Keith G
¿Qué dicen las advertencias?
Hugo Estrada
¿Recibes un error o una advertencia?
Jay Cummins
Advertencia. Se compila muy bien. Mis intereses están más allá de la existencia de la advertencia. Es más preocupante en términos de rendimiento, buenas prácticas de diseño, etc. La advertencia es: Advertencia 15 Procesador de advertencia de exportador de biblioteca de tipos 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (valor), ArcMemorialCore'. Advertencia: el exportador de biblioteca de tipos encontró una instancia de tipo genérico en una firma. El código genérico no se puede exportar a COM.
George Silva

Respuestas:

10

La advertencia que recibió es porque tiene su clase (o conjunto) marcada con:

[ComVisible(true)]

Esto hace que el compilador emita advertencias cuando utiliza tipos que no son compatibles con los objetos COM.

Dicho esto, no hay ningún problema con el uso de genéricos con los tipos de ArcObject. Sin embargo, solo debe usarlos para los tipos que son internos a su aplicación, es decir, cuando trabaja con un conjunto de valores.

Reed Copsey
fuente
Además de esto, creo que es solo un problema para COM + referirse a un nombre de tipo genérico, por ejemplo List<object>. Pasar de CLR a COM + no debería ser un problema.
Dandy
1
Puede evitar este tipo de advertencias marcando su propiedad como [Comisible (falso)] mientras permite que la clase (o el conjunto completo, que no es una práctica recomendada en .NET 2.0+) se marque como [Comvisible (verdadero)].
Petr Krebs
Como referencia: interoperando con tipos genéricos
Adam Armor el
2

No tengo ningún problema para que se compile.

Estoy 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; }
        }
    }
Shawn Deutch
fuente