ใช้. NET Generics เพื่อจัดเก็บ ArcObjects?


11

อะไรคือความหมายของการใช้ Generic types ใน. NET เพื่อเก็บ ArcObjects เช่น ILayer, IField เป็นต้น

คอมไพเลอร์ส่งคำเตือนให้ฉันเมื่อใช้ค่าเหล่านี้

public class Foo
{
    private List<ILayer> fooLayers;

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

นี่คือคำเตือน:

คำเตือน 15 การประมวลผลคำเตือนผู้ส่งออกไลบรารีชนิด 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved (ค่า), ArcMemorialCore' คำเตือน: ผู้ส่งออกไลบรารีประเภทพบอินสแตนซ์ชนิดทั่วไปในลายเซ็น รหัสทั่วไปอาจไม่สามารถส่งออกไปยัง COM ArcMemorialCore

ความกังวลของฉันไม่เพียง แต่มีอยู่ของคำเตือนเท่านั้น แต่ยังรวมถึงแนวทางการออกแบบที่ดีประสิทธิภาพ ฯลฯ


คุณได้รับคำเตือนอะไรบ้าง
Reed Copsey

4
โปรดเพิ่มบริบทให้กับคำถามของคุณด้วย เราจำเป็นต้องทราบเพิ่มเติมเกี่ยวกับวิธีการใช้งานของวัตถุ เท่าที่ฉันรู้ไม่มีปัญหาโดยธรรมชาติกับการใช้ ArcObjects คลาสหรืออินเทอร์เฟซเช่นนี้
Keith G

คำเตือนบอกว่าอย่างไร?
Hugo Estrada

คุณได้รับข้อผิดพลาดหรือคำเตือนหรือไม่?
Jay Cummins

คำเตือน. มันรวบรวมได้ดี ความสนใจของฉันอยู่นอกเหนือการเตือนภัย มันเป็นเรื่องที่น่าเป็นห่วงในแง่ของประสิทธิภาพการออกแบบที่ดี ฯลฯ คำเตือนคือ: คำเตือน 15 ประเภทผู้ส่งออกไลบรารีคำเตือนการประมวลผล คำเตือน: ผู้ส่งออกไลบรารีประเภทพบอินสแตนซ์ชนิดทั่วไปในลายเซ็น รหัสทั่วไปอาจไม่สามารถส่งออกไปยัง COM
George Silva

คำตอบ:


10

คำเตือนที่คุณได้รับเนื่องจากคุณมีคลาส (หรือชุดประกอบ) ที่ทำเครื่องหมายด้วย:

[ComVisible(true)]

ซึ่งทำให้คอมไพเลอร์ออกคำเตือนเมื่อคุณใช้ชนิดที่เข้ากันไม่ได้กับวัตถุ COM

ที่ถูกกล่าวว่าไม่มีปัญหากับการใช้ generics กับประเภท ArcObject อย่างไรก็ตามคุณควรใช้เฉพาะกับประเภทที่อยู่ภายในแอปพลิเคชันของคุณเช่น: เมื่อคุณทำงานกับชุดของค่า


เพิ่มไปนี้ผมเชื่อว่ามันเป็นเพียงปัญหาสำหรับ COM + List<object>ในการอ้างถึงชื่อประเภททั่วไปตัวอย่างเช่น การเปลี่ยนจาก CLR เป็น COM + ไม่น่าจะมีปัญหา
Dandy

1
คุณสามารถหลีกเลี่ยงคำเตือนประเภทนี้ได้โดยทำเครื่องหมายคุณสมบัติของคุณเป็น [ComVisible (false)] ในขณะที่ยังอนุญาตให้คลาส (หรือชุดประกอบทั้งหมดซึ่งไม่แนะนำให้ใช้ใน. NET 2.0+) เพื่อทำเครื่องหมายเป็น [ComVisible (จริง)]
Petr Krebs


2

ฉันไม่มีปัญหาในการรวบรวม

ฉันใช้ 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; }
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.