using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Runtime.Serialization; namespace XFEExtension.NetCore.AutoConfig; /// /// 配置文件字典 /// /// 配置文件类型 /// 字典Key泛型 /// 字典Value泛型 public class ProfileDictionary : ICollection>, IEnumerable>, IEnumerable, IDictionary, IReadOnlyCollection>, IReadOnlyDictionary, ICollection, IDictionary, IDeserializationCallback, ISerializable where TKey : notnull { private readonly Dictionary _innerDictionary; /// /// 创建空字典 /// public ProfileDictionary() => _innerDictionary = []; /// /// 使用现有字典创建 /// /// 现有字典 public ProfileDictionary(Dictionary innerDictionary) => _innerDictionary = innerDictionary; /// public TValue this[TKey key] { get => ((IDictionary)_innerDictionary)[key]; set => ((IDictionary)_innerDictionary)[key] = value; } /// public object? this[object key] { get => ((IDictionary)_innerDictionary)[key]; set => ((IDictionary)_innerDictionary)[key] = value; } /// public int Count => ((ICollection>)_innerDictionary).Count; /// public bool IsReadOnly => ((ICollection>)_innerDictionary).IsReadOnly; /// public ICollection Keys => ((IDictionary)_innerDictionary).Keys; /// public ICollection Values => ((IDictionary)_innerDictionary).Values; /// public bool IsSynchronized => ((ICollection)_innerDictionary).IsSynchronized; /// public object SyncRoot => ((ICollection)_innerDictionary).SyncRoot; /// public bool IsFixedSize => ((IDictionary)_innerDictionary).IsFixedSize; IEnumerable IReadOnlyDictionary.Keys => ((IReadOnlyDictionary)_innerDictionary).Keys; ICollection IDictionary.Keys => ((IDictionary)_innerDictionary).Keys; IEnumerable IReadOnlyDictionary.Values => ((IReadOnlyDictionary)_innerDictionary).Values; ICollection IDictionary.Values => ((IDictionary)_innerDictionary).Values; /// public void Add(KeyValuePair item) { ((ICollection>)_innerDictionary).Add(item); XFEProfile.SaveProfile(typeof(TProfile)); } /// public void Add(TKey key, TValue value) { ((IDictionary)_innerDictionary).Add(key, value); XFEProfile.SaveProfile(typeof(TProfile)); } /// public void Add(object key, object? value) { ((IDictionary)_innerDictionary).Add(key, value); XFEProfile.SaveProfile(typeof(TProfile)); } /// public void Clear() { ((ICollection>)_innerDictionary).Clear(); XFEProfile.SaveProfile(typeof(TProfile)); } /// public bool Contains(KeyValuePair item) => ((ICollection>)_innerDictionary).Contains(item); /// public bool Contains(object key) => ((IDictionary)_innerDictionary).Contains(key); /// public bool ContainsKey(TKey key) => ((IDictionary)_innerDictionary).ContainsKey(key); /// public bool ContainsValue(TValue value) => _innerDictionary.ContainsValue(value); /// public void CopyTo(KeyValuePair[] array, int arrayIndex) => ((ICollection>)_innerDictionary).CopyTo(array, arrayIndex); /// public void CopyTo(Array array, int index) => ((ICollection)_innerDictionary).CopyTo(array, index); /// public IEnumerator> GetEnumerator() => ((IEnumerable>)_innerDictionary).GetEnumerator(); /// [Obsolete] public void GetObjectData(SerializationInfo info, StreamingContext context) => ((ISerializable)_innerDictionary).GetObjectData(info, context); /// public void OnDeserialization(object? sender) => ((IDeserializationCallback)_innerDictionary).OnDeserialization(sender); /// public bool Remove(KeyValuePair item) { var result = ((ICollection>)_innerDictionary).Remove(item); XFEProfile.SaveProfile(typeof(TProfile)); return result; } /// public bool Remove(TKey key) { var result = ((IDictionary)_innerDictionary).Remove(key); XFEProfile.SaveProfile(typeof(TProfile)); return result; } /// public void Remove(object key) { ((IDictionary)_innerDictionary).Remove(key); XFEProfile.SaveProfile(typeof(TProfile)); } /// public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value) => ((IDictionary)_innerDictionary).TryGetValue(key, out value); /// public bool TryAdd(TKey key, TValue value) { var result = _innerDictionary.TryAdd(key, value); XFEProfile.SaveProfile(typeof(TProfile)); return result; } IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_innerDictionary).GetEnumerator(); IDictionaryEnumerator IDictionary.GetEnumerator() => ((IDictionary)_innerDictionary).GetEnumerator(); }