/ReadOnlyExtensions

Extension methods to wrap generic collections and expose them as read only.

Primary LanguageC#MIT LicenseMIT

ReadOnlyExtensions

Extensions to expose lists, collections, dictionaries, and enumerables as read-only.

Installation

Package Manager

Install-Package ReadOnlyExtensions

.NET CLI

dotnet add package ReadOnlyExtensions

How to Use

Simply call AsReadOnly() on any collection that implements IList<T>, ICollection<T>, IDictionary<TKey,TValue>, or IEnumerable<T>.

Enumerables expose a read-only interface. However, if the underlying collection is not read-only, casting can be used to alter it. Using the AsReadOnly() extension will prevent this.

var myReadOnlyList = myList.AsReadOnly();

Typically you would expose a read-only collection where the class will manage the state internally.

public class MyClass
{
    // private list that can be manipulated
    private readonly IList<Item> _items = new List<Item>();

    // public list that is read only
    public IReadOnlyList<Item> Items => _items.AsReadOnly();

    public void AddItem(Item item)
    {
        _items.Add(item);
    }

    public void RemoveItem(Item item)
    {
        _items.Remove(item);
    }
}
public class MyClass
{
    // private dictionary that can be manipulated
    private readonly IDictionary<int, Item> _items = new Dictionary<int, Item>();

    // public dictionary that is read only
    public IReadOnlyDictionary<int, Item> Items => _items.AsReadOnly();

    public void AddItem(Item item)
    {
        _items[item.Id] = item;
    }

    public void RemoveItem(int itemId)
    {
        _items.Remove(itemId);
    }
}
public class MyClass
{
    // private collection that can be manipulated
    private readonly ICollection<Item> _items = new HashSet<Item>();

    // public collection that is read only
    public IReadOnlyCollection<Item> Items => _items.AsReadOnly();

    public void AddItem(Item item)
    {
        _items.Add(item);
    }

    public void RemoveItem(Item item)
    {
        _items.Remove(item);
    }
}