我有一个ICollection<T>
类型的字段。有没有一种简单的方法可以让它只读?
注意,ReadOnlyCollection<T>
类需要IList<T>
,我正在寻找一种方法来反转ICollection<T>
并确保用户无法更改集合。
使用AsEnumerable
ex。方法,不保证,因为它可以被转换回原始类型,也可以是List
。
答案 0 :(得分:1)
我一直认为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 interface-variance功能,所以如果您正在执行上述操作,那么实现IReadOnlyCollection<T>
答案 1 :(得分:1)
ICollection实现了IEnumerable,所以我认为你可以做.ToList().AsReadOnly()
。但正如Peter Duniho所指出的,这会创建原始集合的副本,因此对副本的任何更改都不会在副本中显示,尽管看起来这可能是您想要的。