Verwenden von .NET Generics zum Speichern von ArcObjects?

11

Welche Auswirkungen hat die Verwendung generischer Typen in .NET zum Speichern von ArcObjects wie ILayer, IField usw.?

Der Compiler gibt mir eine Warnung aus, wenn diese Art von Werten verwendet wird

public class Foo
{
    private List<ILayer> fooLayers;

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

Hier ist die Warnung:

Warnung 15 Geben Sie die Warnungsverarbeitung für den Bibliotheksexporteur 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (Wert), ArcMemorialCore' ein. Warnung: Der Typbibliotheksexporter hat eine generische Typinstanz in einer Signatur gefunden. Generischer Code darf nicht nach COM exportiert werden. ArcMemorialCore

Mein Anliegen ist nicht nur die Existenz der Warnung, sondern auch gute Entwurfspraktiken, Leistung usw.

George Silva
quelle
Welche Warnung bekommst du?
Reed Copsey
4
Bitte fügen Sie Ihrer Frage auch einen Kontext hinzu. Wir müssen mehr darüber wissen, wie Sie die Objekte verwenden. Soweit ich weiß, gibt es keine inhärenten Probleme bei der Verwendung solcher ArcObjects-Klassen oder -Schnittstellen.
Keith G
Was sagen die Warnungen?
Hugo Estrada
Erhalten Sie einen Fehler oder eine Warnung?
Jay Cummins
Warnung. Es kompiliert ganz gut. Meine Interessen gehen über die Existenz der Warnung hinaus. Es ist eher ein Problem in Bezug auf Leistung, gute Entwurfspraktiken usw. Die Warnung lautet: Warnung 15 Typbibliotheks-Exporter-Warnverarbeitung 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (Wert), ArcMemorialCore'. Warnung: Der Typbibliotheksexporter hat eine generische Typinstanz in einer Signatur gefunden. Generischer Code darf nicht nach COM exportiert werden.
George Silva

Antworten:

10

Die Warnung, die Sie erhalten haben, ist, weil Ihre Klasse (oder Versammlung) gekennzeichnet ist mit:

[ComVisible(true)]

Dies führt dazu, dass der Compiler Warnungen ausgibt, wenn Sie Typen verwenden, die nicht mit COM-Objekten kompatibel sind.

Abgesehen davon gibt es kein Problem bei der Verwendung von Generika mit ArcObject-Typen. Sie sollten sie jedoch nur für Typen verwenden, die für Ihre Anwendung intern sind, dh wenn Sie mit einer Reihe von Werten arbeiten.

Reed Copsey
quelle
Ich glaube, dass es für COM + nur ein Problem ist, sich beispielsweise auf einen generischen Typnamen zu beziehen List<object>. Der Wechsel von CLR zu COM + sollte kein Problem sein.
Dandy
1
Sie können diese Art von Warnungen vermeiden, indem Sie Ihre Eigenschaft als [ComVisible (false)] markieren, während die Klasse (oder die gesamte Assembly, die in .NET 2.0+ nicht empfohlen wird) weiterhin als [ComVisible (true)] markiert werden kann.
Petr Krebs
Als Referenz: Interoperieren mit generischen Typen
Adam Armor
2

Ich habe kein Problem damit, es zu kompilieren.

Ich benutze 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
quelle