Używasz .NET Generics do przechowywania ArcObjects?


11

Jakie są konsekwencje używania typów ogólnych w .NET do przechowywania ArcObjects, takich jak ILayer, IField itp.?

Kompilator generuje ostrzeżenie podczas korzystania z tego rodzaju wartości

public class Foo
{
    private List<ILayer> fooLayers;

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

Oto ostrzeżenie:

Ostrzeżenie 15 Przetwarzanie ostrzeżenia eksportera biblioteki typów „ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (wartość), ArcMemorialCore”. Ostrzeżenie: eksporter biblioteki typów napotkał wystąpienie typu ogólnego w podpisie. Kod ogólny nie może być eksportowany do COM. ArcMemorialCore

Moje obawy dotyczą nie tylko istnienia ostrzeżenia, ale dobrych praktyk projektowych, wydajności itp.


Jakie otrzymujesz ostrzeżenie?
Reed Copsey

4
Dodaj także kontekst do swojego pytania. Musimy dowiedzieć się więcej o tym, jak korzystasz z obiektów. O ile mi wiadomo, nie ma nieodłącznych problemów z używaniem klas ArcObjects lub takich interfejsów.
Keith G

Co mówią ostrzeżenia?
Hugo Estrada

Otrzymujesz błąd lub ostrzeżenie?
Jay Cummins,

Ostrzeżenie. Kompiluje się dobrze. Moje zainteresowania wykraczają poza istnienie ostrzeżenia. Jest to bardziej problem pod względem wydajności, dobrych praktyk projektowych itp. Ostrzeżenie: Ostrzeżenie 15 Przetwarzanie ostrzeżenia eksportera biblioteki typów „ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (wartość), ArcMemorialCore”. Ostrzeżenie: eksporter biblioteki typów napotkał wystąpienie typu ogólnego w podpisie. Kod ogólny nie może być eksportowany do COM.
George Silva

Odpowiedzi:


10

Otrzymane ostrzeżenie wynika z tego, że masz klasę (lub zgromadzenie) oznaczone:

[ComVisible(true)]

Powoduje to, że kompilator wydaje ostrzeżenia, gdy używasz typów niezgodnych z obiektami COM.

Biorąc to pod uwagę, nie ma problemu z używaniem generycznych typów ArcObject. Powinieneś jednak używać ich tylko w przypadku typów wewnętrznych dla Twojej aplikacji - tj .: gdy pracujesz z zestawem wartości.


Dodając do tego, uważam, że problemem dla COM + jest na przykład odwołanie się do nazwy typu ogólnego, na przykład List<object>. Przejście z CLR na COM + nie powinno stanowić problemu.
Dandy

1
Możesz uniknąć tego rodzaju ostrzeżeń, oznaczając swoją właściwość jako [ComVisible (false)], jednocześnie umożliwiając oznaczenie klasy (lub całego zestawu, co nie jest zalecane w .NET 2.0+) jako [ComVisible (true)].
Petr Krebs,


2

Nie mam problemu z kompilacją.

Używam 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; }
        }
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.