1

我有一个类型的字段ICollection<T>。有没有简单的方法让它只读?

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

使用AsEnumerable前。方法,不能保证,因为它可以被转换回它的原始类型,也可以是List.

4

2 回答 2

1

ReadOnlyCollection<T>我一直觉得这真的是一个只读列表有点奇怪。

也就是说,ICollection<T>是一个如此简单的接口,实现一个 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();
    }
}

请注意,使用 .NET 4.5 也有实际的只读接口来支持新的接口变化功能,因此如果您正在执行上述操作,也可以很好地实现IReadOnlyCollection<T>

于 2014-10-21T00:55:11.420 回答
1

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

于 2014-10-21T01:05:10.110 回答