返回一个ICollection<;T>;作为IReadOnlyCollection<;T>;

本文关键字:lt gt IReadOnlyCollection 作为 ICollection 一个 返回 | 更新日期: 2023-09-27 18:27:10

我有一个类型为ICollection<T>的字段。有没有一种简单的方法可以使它只读?

注意,ReadOnlyCollection<T>类采用IList<T>,我正在寻找一种方法来反转ICollection<T>并确保用户不能更改集合。

使用AsEnumerable ex.方法不能保证这一点,因为它可以被广播回其原始类型,也可以是List

返回一个ICollection<;T>;作为IReadOnlyCollection<;T>;

我一直觉得ReadOnlyCollection<T>实际上是一个只读列表有点奇怪。

也就是说,ICollection<T>是一个如此简单的接口,实现一个真正的ReadOnlyCollection<T>:是微不足道的

public class TrueReadOnlyCollection<T> : ICollection<T>, IReadOnlyCollection<T>
{
    private ICollection<T> _original;
    public TrueReadOnlyCollection(ICollection<T> original)
    {
        _original = original;
    }
    public void Add(T item)
    {
        throw new NotSupportedException();
    }
    public void Clear()
    {
        throw new NotSupportedException();
    }
    public bool Contains(T item)
    {
        return _original.Contains(item);
    }
    public void CopyTo(T[] array, int arrayIndex)
    {
        _original.CopyTo(array, arrayIndex);
    }
    public int Count
    {
        get { return _original.Count; }
    }
    public bool IsReadOnly
    {
        get { return true; }
    }
    public bool Remove(T item)
    {
        throw new NotSupportedException();
    }
    public IEnumerator<T> GetEnumerator()
    {
        foreach (T t in _original)
        {
            yield return t;
        }
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

请注意,在.NET 4.5中,也有实际的只读接口来支持newish接口差异特性,因此如果您正在执行上述操作,还可以实现IReadOnlyCollection<T>

ICollection实现了IEnumerable,所以我认为您可以只做.ToList().AsReadOnly()。但正如Peter Duniho所指出的,这会创建一个原始收藏的副本,因此对其的任何更改都不会在副本中显示出来,尽管看起来这可能是你想要的。