I've always thought it a little odd that ReadOnlyCollection<T>
is really a read-only list.
That said, ICollection<T>
is such a simple interface, it's trivial to implement a true 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();
}
}
Note that with .NET 4.5 there are also actual read-only interfaces to support the newish interface-variance features, so if you're doing the above it might be nice to also implement IReadOnlyCollection<T>