使用.NET泛型来存储ArcObjects?


11

在.NET中使用通用类型存储ArcObjects(例如ILayer,IField等)有什么含义?

使用这些类型的值时,编译器会向我发出警告

public class Foo
{
    private List<ILayer> fooLayers;

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

这是警告:

警告15类型库导出程序警告处理'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved(value),ArcMemorialCore'。警告:类型库导出程序在签名中遇到了通用类型实例。通用代码可能不会导出到COM。ArcMemorialCore

我关心的不仅是警告的存在,还包括良好的设计规范,性能等。


您收到什么警告?
里德·科普西

4
请为您的问题添加一些背景信息。我们需要更多地了解您如何使用这些对象。据我所知,使用这样的ArcObjects类或接口没有固有的问题。
基思·G

警告说什么?
雨果·埃斯特拉达

您收到错误或警告吗?
杰·康明斯

警告。它编译就好了。我的兴趣超出了警告的范围。在性能,良好的设计实践等方面,它更值得关注。警告是:警告15类型库导出程序警告处理'ArcMemorialCore.Topography.IMemorialDocument.set_ProfessionalsEnvolved(value),ArcMemorialCore'。警告:类型库导出程序在签名中遇到了通用类型实例。通用代码可能不会导出到COM。
乔治席尔瓦

Answers:


10

您收到的警告是因为您将类(或程序集)标记为:

[ComVisible(true)]

当您使用与COM对象不兼容的类型时,这将导致编译器发出警告。

话虽这么说,对ArcObject类型使用泛型没有问题。但是,只应将它们用于应用程序内部的类型-即:当您使用一组值时。


除此之外,我相信COM +引用通用类型名称只是一个问题,例如List<object>。从CLR到COM +应该不是问题。
丹迪

1
您可以通过将属性标记为[ComVisible(false)]来避免这种警告,同时仍然允许将该类(或整个程序集,在.NET 2.0+中不建议这样做)标记为[ComVisible(true)]。
彼得·克雷布斯


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; }
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.