Utilizzando .NET Generics per archiviare ArcObjects?


11

Quali sono le implicazioni dell'utilizzo di tipi generici in .NET per archiviare ArcObjects, come ILayer, IField, ecc.?

Il compilatore mi lancia un avvertimento quando si utilizza questo tipo di valori

public class Foo
{
    private List<ILayer> fooLayers;

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

Ecco l'avvertimento:

Avviso 15 Elaborazione dell'avviso dell'esportatore della libreria di tipi "ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore". Avviso: l'esportatore della libreria dei tipi ha rilevato un'istanza di tipo generico in una firma. Il codice generico non può essere esportato in COM. ArcMemorialCore

La mia preoccupazione non è solo l'esistenza dell'avvertimento, ma di buone pratiche di progettazione, prestazioni, ecc.


Che avvertimento ricevi?
Reed Copsey,

4
Aggiungi un po 'di contesto anche alla tua domanda. Dobbiamo sapere di più su come stai usando gli oggetti. Per quanto ne so non ci sono problemi intrinseci nell'uso di classi o interfacce ArcObjects come questa.
Keith G,

Cosa dicono gli avvisi?
Hugo Estrada

Ricevi un errore o un avviso?
Jay Cummins,

Avvertimento. Si compila bene. I miei interessi vanno oltre l'esistenza dell'avvertimento. È più preoccupante in termini di prestazioni, buone pratiche di progettazione, ecc. L'avvertimento è: Avvertimento 15 Elaborazione dell'avviso dell'esportatore della libreria dei tipi 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Avviso: l'esportatore della libreria dei tipi ha rilevato un'istanza di tipo generico in una firma. Il codice generico non può essere esportato in COM.
George Silva,

Risposte:


10

L'avviso che hai ricevuto è perché hai la tua classe (o assembly) contrassegnata con:

[ComVisible(true)]

In questo modo il compilatore emette avvisi quando si utilizzano tipi non compatibili con gli oggetti COM.

Detto questo, non vi è alcun problema con l'uso di generici con tipi ArcObject. Tuttavia, dovresti usarli solo per tipi interni alla tua applicazione, ad es. Quando lavori con un set di valori.


Aggiungendo a questo credo che per COM + sia solo un problema fare riferimento ad un nome di tipo generico, ad esempio List<object>. Passare da CLR a COM + non dovrebbe essere un problema.
Dandy,

1
È possibile evitare questo tipo di avvertenze contrassegnando la proprietà come [ComVisible (false)] pur consentendo alla classe (o intero assembly, che non è raccomandato in .NET 2.0+) di essere contrassegnata come [ComVisible (true)].
Petr Krebs,


2

Non ho problemi a farlo compilare.

Sto 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; }
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.