我认为 IEnumerable 事物是您可以迭代的对象。
如果它们也是 ICollection ,你就会知道里面有多少元素。
如果它们甚至是 IList s,您可以从特定索引中获取包含对象。

ReadOnlyCollection<T> 实现了 IList<T> 。所以 ReadOnlyList<T> 不会是一个更好的名字。

框架中是否有真正的 ReadOnlyCollection<T>
(所以我不需要IList来创建这样的只读包装器)

最佳答案

由于 ReadOnlyCollection<T> 只是 IList<T> 不允许修改列表的包装器,因此为 ICollection<T> 生成类似的包装器应该很容易:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

class MyReadOnlyCollection<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable
{
    private ICollection<T> _collection;
    private object _syncRoot;

    public MyReadOnlyCollection(ICollection<T> collection)
    {
        _collection = collection;
    }


    public void Add(T item)
    {
        throw new NotSupportedException("Trying to modify a read-only collection.");
    }

    public void Clear()
    {
        throw new NotSupportedException("Trying to modify a read-only collection.");
    }

    public bool Contains(T item)
    {
        return _collection.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _collection.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return _collection.Count; }
    }

    public bool IsReadOnly
    {
        get { return true; }
    }

    public bool Remove(T item)
    {
        throw new NotSupportedException("Trying to modify a read-only collection.");
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _collection.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return ((ICollection)_collection).GetEnumerator();
    }

    public void CopyTo(Array array, int index)
    {
        ((ICollection)_collection).CopyTo(array, index);
    }

    public bool IsSynchronized
    {
        get { return false; }
    }

    public object SyncRoot
    {
        get
        {
            if (_syncRoot == null)
            {
                ICollection list = _collection as ICollection;
                if (list != null)
                {
                    _syncRoot = list.SyncRoot;
                }
                else
                {
                    Interlocked.CompareExchange(ref _syncRoot, new object(), null);
                }
            }
            return _syncRoot;
        }
    }
}

关于.net - 为什么 ReadOnlyCollection<T> 不是 ReadOnlyList<T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5976772/

10-12 04:20