Vous pouvez utiliser le décorateur suivant pour envelopper l'ensemble de hachage et retourner un ICollection<T>
qui est en lecture seule (la IsReadOnly
propriété renvoie true et les méthodes de modification jeter un NotSupportedException
tel que spécifié dans le contrat de ICollection<T>
):
public class MyReadOnlyCollection<T> : ICollection<T>
{
private readonly ICollection<T> decoratedCollection;
public MyReadOnlyCollection(ICollection<T> decorated_collection)
{
decoratedCollection = decorated_collection;
}
public IEnumerator<T> GetEnumerator()
{
return decoratedCollection.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable) decoratedCollection).GetEnumerator();
}
public void Add(T item)
{
throw new NotSupportedException();
}
public void Clear()
{
throw new NotSupportedException();
}
public bool Contains(T item)
{
return decoratedCollection.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
decoratedCollection.CopyTo(array, arrayIndex);
}
public bool Remove(T item)
{
throw new NotSupportedException();
}
public int Count
{
get { return decoratedCollection.Count; }
}
public bool IsReadOnly
{
get { return true; }
}
}
Et vous pouvez l'utiliser comme ceci:
public class MyClass
{
private readonly HashSet<string> _referencedColumns;
public ICollection<string> ReferencedColumns {
get { return new MyReadOnlyCollection<string>(_referencedColumns); }
}
//...
S'il vous plaît noter que cette solution ne sera pas prendre un instantané de la HashSet, au lieu qu'il tiendra une référence au HashSet. Cela signifie que la collection retournée contiendra une version en direct de HashSet, c'est-à-dire, si le HashSet est modifié, le consommateur qui a obtenu la collection en lecture seule avant que la modification puisse voir la modification.
S'il est important appelants tha Thet ne peut pas modifier le retour, jetez un oeil à [Immutability et ReadOnlyCollection] (https://blogs.msdn.microsoft.com/jaredpar/2008/04/22/immutability-and-readonlycollectiont/) et peut-être [cette question (http : //stackoverflow.com/questions/285323/best-practice-how-to-expose-a-read-only-icollection) –
stuartd