Edit: I changed Keys and Values collection to IEnumerable. Previously it was ICollection which has a Remove and Add method.
public interface IReadOnlyDictionary<TKey, TValue> { bool ContainsKey(TKey key); IEnumerable<TKey> Keys { get; } IEnumerable<TValue> Values { get; } int Count { get; } bool IsReadOnly { get; } bool TryGetValue(TKey key, out TValue value); TValue this[TKey key] { get; } bool Contains(KeyValuePair<TKey, TValue> item); void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex); IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator(); } public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue> { private readonly IDictionary<TKey, TValue> dictionary; public ReadOnlyDictionary() { this.dictionary = new Dictionary<TKey, TValue>(); } public ReadOnlyDictionary(IDictionary<TKey, TValue> dictionary) { this.dictionary = dictionary; } public void Add(TKey key, TValue value) { throw new NotSupportedException("This dictionary is read-only"); } public bool ContainsKey(TKey key) { return this.dictionary.ContainsKey(key); } public ICollection<TKey> Keys { get { return this.dictionary.Keys; } } public bool Remove(TKey key) { throw new NotSupportedException("This dictionary is read-only"); } public bool TryGetValue(TKey key, out TValue value) { return this.dictionary.TryGetValue(key, out value); } public ICollection<TValue> Values { get { return this.dictionary.Values; } } public TValue this[TKey key] { get { return this.dictionary[key]; } set { throw new NotSupportedException("This dictionary is read-only"); } } public void Add(KeyValuePair<TKey, TValue> item) { throw new NotSupportedException("This dictionary is read-only"); } public void Clear() { throw new NotSupportedException("This dictionary is read-only"); } public bool Contains(KeyValuePair<TKey, TValue> item) { return this.dictionary.Contains(item); } public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) { this.dictionary.CopyTo(array, arrayIndex); } public int Count { get { return this.dictionary.Count; } } public bool IsReadOnly { get { return true; } } public bool Remove(KeyValuePair<TKey, TValue> item) { throw new NotSupportedException("This dictionary is read-only"); } public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { return this.dictionary.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (this.dictionary as System.Collections.IEnumerable).GetEnumerator(); }
}