Menggunakan .NET Generics untuk menyimpan ArcObjects?

11

Apa implikasi dari penggunaan tipe Generic di .NET untuk menyimpan ArcObjects, seperti ILayer, IField, dll?

Kompiler memberi saya peringatan saat menggunakan nilai-nilai semacam ini

public class Foo
{
    private List<ILayer> fooLayers;

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

Ini peringatannya:

Peringatan 15 Jenis pustaka pengekspor peringatan pemrosesan 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Peringatan: Eksportir tipe perpustakaan menemui instance tipe generik dalam tanda tangan. Kode generik tidak boleh diekspor ke COM. ArcMemorialCore

Kekhawatiran saya bukan hanya keberadaan peringatan, tetapi praktik desain yang baik, kinerja, dll.

George Silva
sumber
Peringatan apa yang Anda dapatkan?
Reed Copsey
4
Harap tambahkan beberapa konteks ke pertanyaan Anda juga. Kami perlu tahu lebih banyak tentang bagaimana Anda menggunakan objek. Sejauh yang saya tahu tidak ada masalah inheren dengan menggunakan kelas atau antarmuka ArcObjects seperti ini.
Keith G
Apa kata peringatan itu?
Hugo Estrada
Apakah Anda mendapatkan kesalahan atau peringatan?
Jay Cummins
Peringatan. Mengkompilasi dengan baik. Minat saya berada di luar keberadaan peringatan itu. Ini lebih menjadi perhatian dalam hal kinerja, praktik desain yang baik, dll. Peringatan itu adalah: Peringatan 15 Jenis perpustakaan peringatan pemrosesan 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (value), ArcMemorialCore'. Peringatan: Eksportir tipe perpustakaan menemui instance tipe generik dalam tanda tangan. Kode generik tidak boleh diekspor ke COM.
George Silva

Jawaban:

10

Peringatan yang Anda terima adalah karena kelas Anda (atau majelis) ditandai dengan:

[ComVisible(true)]

Ini menyebabkan kompiler mengeluarkan peringatan ketika Anda menggunakan tipe yang tidak kompatibel dengan objek COM.

Yang sedang berkata, tidak ada masalah dengan menggunakan obat generik dengan tipe ArcObject. Anda harus, bagaimanapun, hanya menggunakannya untuk jenis yang internal untuk aplikasi Anda - yaitu: ketika Anda bekerja dengan satu set nilai.

Reed Copsey
sumber
Menambah ini saya percaya itu hanya masalah bagi COM + untuk merujuk ke nama tipe umum, misalnya List<object>. Beralih dari CLR ke COM + seharusnya tidak menjadi masalah.
Dandy
1
Anda dapat menghindari peringatan semacam ini dengan menandai properti Anda sebagai [ComVisible (false)] sambil tetap mengizinkan kelas (atau seluruh majelis, yang tidak disarankan praktik di .NET 2.0+) ditandai sebagai [ComVisible (true)].
Petr Krebs
Untuk referensi: Beroperasional Menggunakan Jenis Generik
Adam Armor
2

Saya tidak memiliki masalah saat mengkompilasi.

Saya menggunakan 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
sumber