Поскольку 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;
}
}
}