Sử dụng .NET Generics để lưu trữ ArcObjects?


11

Ý nghĩa của việc sử dụng các loại Chung trong .NET để lưu trữ ArcObjects, chẳng hạn như ILayer, IField, v.v.?

Trình biên dịch ném cho tôi một cảnh báo khi sử dụng các loại giá trị này

public class Foo
{
    private List<ILayer> fooLayers;

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

Đây là cảnh báo:

Cảnh báo 15 Xử lý cảnh báo xuất khẩu thư viện loại 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolve (value), ArcMemorialCore'. Cảnh báo: Trình xuất thư viện loại gặp trường hợp loại chung trong chữ ký. Mã chung có thể không được xuất sang COM. ArcMemorialCore

Mối quan tâm của tôi không chỉ là sự tồn tại của cảnh báo, mà còn về thực hành thiết kế tốt, hiệu suất, v.v.


Bạn đang nhận được cảnh báo gì?
Sậy Copsey

4
Vui lòng thêm một số bối cảnh cho câu hỏi của bạn quá. Chúng tôi cần biết thêm về cách bạn đang sử dụng các đối tượng. Theo như tôi biết thì không có vấn đề cố hữu nào khi sử dụng các lớp hoặc giao diện ArcObjects như thế này.
Keith G

Những cảnh báo nói lên điều gì?
Hugo Estrada

Bạn đang nhận được một lỗi hoặc một cảnh báo?
Jay Cummins

Cảnh báo. Nó biên dịch tốt. Lợi ích của tôi là vượt quá sự tồn tại của cảnh báo. Đó là mối quan tâm nhiều hơn về hiệu suất, thực hành thiết kế tốt, v.v. Cảnh báo là: Cảnh báo 15 Xử lý cảnh báo xuất khẩu thư viện loại 'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolve (value), ArcMemorialCore'. Cảnh báo: Trình xuất thư viện loại gặp trường hợp loại chung trong chữ ký. Mã chung có thể không được xuất sang COM.
George Silva

Câu trả lời:


10

Cảnh báo bạn nhận được là do bạn có lớp (hoặc hội đồng) được đánh dấu:

[ComVisible(true)]

Điều này khiến trình biên dịch đưa ra cảnh báo khi bạn sử dụng các loại không tương thích với các đối tượng COM.

Điều đó đang được nói, không có vấn đề với việc sử dụng thuốc generic với các loại ArcObject. Tuy nhiên, bạn chỉ nên sử dụng chúng cho các loại bên trong ứng dụng của mình - tức là: khi bạn đang làm việc với một bộ giá trị.


Thêm vào điều này tôi tin rằng đó chỉ là một vấn đề đối với COM + để chỉ một tên loại chung chung List<object>. Đi từ CLR sang COM + không phải là một vấn đề.
Dandy

1
Bạn có thể tránh loại cảnh báo này bằng cách đánh dấu thuộc tính của bạn là [ComVisible (false)] trong khi vẫn cho phép lớp (hoặc toàn bộ lắp ráp, không được khuyến nghị thực hành trong .NET 2.0+) được đánh dấu là [ComVisible (true)].
Petr Krebs


2

Tôi không có vấn đề gì để biên dịch nó.

Tôi đang sử dụng 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; }
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.