【问题标题】:Create ReadOnlyCollection<IDisposable> from e.g. List<FileStream>从例如创建 ReadOnlyCollection<IDisposable>列表<文件流>
【发布时间】:2017-03-17 07:12:13
【问题描述】:

是否可以在不创建列表副本的情况下创建 ReadOnlyCollection?由于可以将元素转换为其基类,因此 ReadOnlyCollection 返回的不是具体类型而是实现的接口应该是安全的。

Edit1 改编代码以显示我需要返回 IList 以保持 API 兼容性。

public class Program : IDisposable
{
   List<Program> Programs = new List<Program>();

   public IList<IDisposable> Getter
   {
        get
        {
            var readOnly = new ReadOnlyCollection<IDisposable>(Programs);
            return readOnly;
        }
   }

    static void Main(string[] args)
    {

    }
    public void Dispose()
    {
    }
}

由于明显的原因,这不会编译,但是没有例如

ReadOnlyCollectionCast<Program,IDisposable>

哪个会在 getter 中转换为 IDisposable?

我是如何到达那里的更多历史。我确实重构了一个类,确实有 List&lt;IDisposable&gt; 作为类成员。我需要对数据容器中的具体类型进行更好的序列化。将私有字段从 List&lt;IDisposable&gt; 更改为 List&lt;Program&gt; 没有问题,但公共属性应保持不变,并且仍将 IList&lt;IDisposable&gt; 作为只读列表返回。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    你总是可以使用 Linq。 programs.Cast&lt;IDisposable&gt;() 给你一个IEnumerable&lt;IDisposable&gt;

    编辑: 如果你真的需要返回一个 IList 但实际上想要返回一些只读集合:

    return new ReadOnlyCollection&lt;IDisposable&gt;( programs.Cast&lt;IDisposable&gt;().ToList() );

    【讨论】:

    • 新的 ReadOnlyCollection(Programs.Cast());不会编译,因为它需要 IList 而不是 IEnumerable。有某种意义,因为 IEnumerable 已经是不可变的。
    【解决方案2】:

    如果你使用如下接口List,则不需要强制转换:

    List<IDisposable> programs = new List<IDisposable>();
    programs.Add(new Program());
    

    这样做以只读方式返回:

    public IEnumerable<IDisposable> GetReadOlnly() 
    {
        return programs.Skip(0);
    } 
    

    返回一个只读的IList

    public IList<IDisposable> GetReadOlnly() 
    {
        return programs.AsReadOnly();
    } 
    

    【讨论】:

    • 好主意,但我需要在公共 getter 中返回一个 IList ,出于 API 兼容的原因需要保留它。
    • 问题是我没有 IDisposable 列表,而是一个具体类的列表。这就是问题所在。
    • 你为什么不按照我在回答中的方式做呢?它是 IDisposable 的列表,但包含具体类型。我认为您没有仔细阅读我的答案。
    • 不,它不是 IDisposables 的列表。它是实现 IDisposable 的 Program 实例的列表。这是我的问题的原始问题陈述。
    • 那你为什么不把它改成 IDisposable 的列表呢?有原因吗?我了解您是否有理由,但在提出解决方案之前我需要理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多