namespace DTLib.Dtsod; public class DtsodDict : IDictionary, IDictionary { // да, вместо собственной реализации интерфейса это ссылки на Dictionary readonly Dictionary baseDict; public DtsodDict() => baseDict = new(); public DtsodDict(IDictionary srcDict) => baseDict = new(srcDict); public virtual TVal this[TKey key] { get => TryGetValue(key, out TVal value) ? value : throw new Exception($"Dtsod[{key}] key not found"); set { if (!TrySetValue(key, value)) throw new KeyNotFoundException($"DtsodDict[{key}] key not found"); } } public virtual bool TryGetValue(TKey key, out TVal value) => baseDict.TryGetValue(key, out value); public virtual bool TrySetValue(TKey key, TVal value) { if (ContainsKey(key)) { baseDict[key] = value; return true; } else return false; } public virtual void Append(ICollection> anotherDtsod) { foreach (KeyValuePair pair in anotherDtsod) Add(pair.Key, pair.Value); } public virtual void Add(TKey key, TVal value) => baseDict.Add(key, value); public virtual void Add(KeyValuePair pair) => ((ICollection>)baseDict).Add(pair); public void CopyTo(Array array, int index) { ((ICollection) baseDict).CopyTo(array, index); } public int Count => baseDict.Count; public bool IsSynchronized => ((ICollection) baseDict).IsSynchronized; public object SyncRoot => ((ICollection) baseDict).SyncRoot; public ICollection Keys => baseDict.Keys; ICollection IDictionary.Values => ((IDictionary) baseDict).Values; ICollection IDictionary.Keys => ((IDictionary) baseDict).Keys; public ICollection Values => baseDict.Values; public bool IsReadOnly { get; } = false; public object this[object key] { get => ((IDictionary) baseDict)[key]; set => ((IDictionary) baseDict)[key] = value; } public void Add(object key, object value) { ((IDictionary) baseDict).Add(key, value); } public virtual void Clear() => baseDict.Clear(); public bool Contains(object key) { return ((IDictionary) baseDict).Contains(key); } IDictionaryEnumerator IDictionary.GetEnumerator() { return ((IDictionary) baseDict).GetEnumerator(); } public void Remove(object key) { ((IDictionary) baseDict).Remove(key); } public bool IsFixedSize => ((IDictionary) baseDict).IsFixedSize; public virtual bool ContainsKey(TKey key) => baseDict.ContainsKey(key); bool ICollection>.Contains(KeyValuePair pair) => ((ICollection>)baseDict).Contains(pair); void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) => ((ICollection>)baseDict).CopyTo(array, arrayIndex); public virtual bool Remove(TKey key) => baseDict.Remove(key); bool ICollection>.Remove(KeyValuePair pair) => ((ICollection>)baseDict).Remove(pair); IEnumerator IEnumerable.GetEnumerator() => baseDict.GetEnumerator(); public IEnumerator> GetEnumerator() => baseDict.GetEnumerator(); }