Vous utilisez des génériques .NET pour stocker des ArcObjects?

11

Quelles sont les implications de l'utilisation de types génériques dans .NET pour stocker des ArcObjects, tels que ILayer, IField, etc.?

Le compilateur me lance un avertissement lors de l'utilisation de ce type de valeurs

public class Foo
{
    private List<ILayer> fooLayers;

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

Voici l'avertissement:

Avertissement 15 Traitement de l'avertissement de l'exportateur de bibliothèque de types «ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore». Avertissement: l'exportateur de bibliothèque de types a rencontré une instance de type générique dans une signature. Le code générique ne peut pas être exporté vers COM. ArcMemorialCore

Ma préoccupation n'est pas seulement l'existence de l'avertissement, mais de bonnes pratiques de conception, de performances, etc.

George Silva
la source
Quel avertissement recevez-vous?
Reed Copsey
4
Veuillez également ajouter du contexte à votre question. Nous devons en savoir plus sur la façon dont vous utilisez les objets. Autant que je sache, il n'y a pas de problèmes inhérents à l'utilisation de classes ou d'interfaces ArcObjects comme celle-ci.
Keith G
Que disent les avertissements?
Hugo Estrada
Recevez-vous une erreur ou un avertissement?
Jay Cummins du
Attention. Il compile très bien. Mes intérêts sont au-delà de l'existence de l'avertissement. Il s'agit davantage d'une préoccupation en termes de performances, de bonnes pratiques de conception, etc. Avertissement: l'exportateur de bibliothèque de types a rencontré une instance de type générique dans une signature. Le code générique ne peut pas être exporté vers COM.
George Silva

Réponses:

10

L'avertissement que vous avez reçu est dû au fait que votre classe (ou votre assembly) est marquée avec:

[ComVisible(true)]

Cela provoque le compilateur émettre des avertissements lorsque vous utilisez des types qui ne sont pas compatibles avec les objets COM.

Cela étant dit, l'utilisation de génériques avec les types ArcObject ne pose aucun problème. Vous ne devez cependant les utiliser que pour les types internes à votre application, c'est-à-dire lorsque vous travaillez avec un ensemble de valeurs.

Reed Copsey
la source
Ajoutant à cela, je crois que c'est seulement un problème pour COM + de se référer à un nom de type générique, par exemple List<object>. Passer de CLR à COM + ne devrait pas être un problème.
Dandy
1
Vous pouvez éviter ce type d'avertissements en marquant votre propriété comme [ComVisible (false)] tout en permettant à la classe (ou à l'assembly entier, ce qui n'est pas recommandé dans .NET 2.0+) d'être marqué comme [ComVisible (true)].
Petr Krebs
Pour référence: Interopérer à l'aide de types génériques
Adam Armor
2

Je n'ai aucun problème à le faire compiler.

J'utilise 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
la source