1

type のフィールドがあり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 に答える