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, IProfileOwnedCollection where TKey : notnull { private readonly Dictionary _innerDictionary; private readonly object _syncRoot = new(); private XFEProfile? _currentProfile; /// /// 创建空字典 /// public ProfileDictionary() => _innerDictionary = []; /// /// 使用现有字典创建 /// /// 现有字典 public ProfileDictionary(Dictionary innerDictionary) => _innerDictionary = innerDictionary; /// public TValue this[TKey key] { get { lock (_syncRoot) return _innerDictionary[key]; } set { lock (_syncRoot) { _innerDictionary[key] = value; RequestSave(); } } } /// public object? this[object key] { get { lock (_syncRoot) return ((IDictionary)_innerDictionary)[key]; } set { lock (_syncRoot) { ((IDictionary)_innerDictionary)[key] = value; RequestSave(); } } } /// public int Count { get { lock (_syncRoot) return _innerDictionary.Count; } } /// /// 当前配置文件实例 /// public XFEProfile? CurrentProfile { get { lock (_syncRoot) return _currentProfile; } set { lock (_syncRoot) _currentProfile = value; } } /// public bool IsReadOnly => ((ICollection>)_innerDictionary).IsReadOnly; /// public ICollection Keys { get { lock (_syncRoot) return _innerDictionary.Keys.ToArray(); } } /// public ICollection Values { get { lock (_syncRoot) return _innerDictionary.Values.ToArray(); } } /// public bool IsSynchronized => true; /// public object SyncRoot => _syncRoot; /// public bool IsFixedSize => ((IDictionary)_innerDictionary).IsFixedSize; IEnumerable IReadOnlyDictionary.Keys { get { lock (_syncRoot) return _innerDictionary.Keys.ToArray(); } } ICollection IDictionary.Keys { get { lock (_syncRoot) return _innerDictionary.Keys.ToArray(); } } IEnumerable IReadOnlyDictionary.Values { get { lock (_syncRoot) return _innerDictionary.Values.ToArray(); } } ICollection IDictionary.Values { get { lock (_syncRoot) return _innerDictionary.Values.ToArray(); } } /// public void Add(KeyValuePair item) { lock (_syncRoot) { ((ICollection>)_innerDictionary).Add(item); RequestSave(); } } /// public void Add(TKey key, TValue value) { lock (_syncRoot) { _innerDictionary.Add(key, value); RequestSave(); } } /// public void Add(object key, object? value) { lock (_syncRoot) { ((IDictionary)_innerDictionary).Add(key, value); RequestSave(); } } /// public void Clear() { lock (_syncRoot) { if (_innerDictionary.Count == 0) return; _innerDictionary.Clear(); RequestSave(); } } /// public bool Contains(KeyValuePair item) { lock (_syncRoot) return ((ICollection>)_innerDictionary).Contains(item); } /// public bool Contains(object key) { lock (_syncRoot) return ((IDictionary)_innerDictionary).Contains(key); } /// public bool ContainsKey(TKey key) { lock (_syncRoot) return _innerDictionary.ContainsKey(key); } /// public bool ContainsValue(TValue value) { lock (_syncRoot) return _innerDictionary.ContainsValue(value); } /// public void CopyTo(KeyValuePair[] array, int arrayIndex) { lock (_syncRoot) ((ICollection>)_innerDictionary).CopyTo(array, arrayIndex); } /// public void CopyTo(Array array, int index) { lock (_syncRoot) ((ICollection)_innerDictionary).CopyTo(array, index); } /// public IEnumerator> GetEnumerator() { lock (_syncRoot) return new Dictionary(_innerDictionary, _innerDictionary.Comparer).GetEnumerator(); } /// [Obsolete] public void GetObjectData(SerializationInfo info, StreamingContext context) { lock (_syncRoot) ((ISerializable)_innerDictionary).GetObjectData(info, context); } /// public void OnDeserialization(object? sender) { lock (_syncRoot) ((IDeserializationCallback)_innerDictionary).OnDeserialization(sender); } /// public bool Remove(KeyValuePair item) { lock (_syncRoot) { var result = ((ICollection>)_innerDictionary).Remove(item); if (result) RequestSave(); return result; } } /// public bool Remove(TKey key) { lock (_syncRoot) { var result = _innerDictionary.Remove(key); if (result) RequestSave(); return result; } } /// public void Remove(object key) { lock (_syncRoot) { var count = _innerDictionary.Count; ((IDictionary)_innerDictionary).Remove(key); if (_innerDictionary.Count != count) RequestSave(); } } /// public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value) { lock (_syncRoot) return _innerDictionary.TryGetValue(key, out value); } /// public bool TryAdd(TKey key, TValue value) { lock (_syncRoot) { var result = _innerDictionary.TryAdd(key, value); if (result) RequestSave(); return result; } } IEnumerator IEnumerable.GetEnumerator() { lock (_syncRoot) return ((IEnumerable)new Dictionary(_innerDictionary, _innerDictionary.Comparer)).GetEnumerator(); } IDictionaryEnumerator IDictionary.GetEnumerator() { lock (_syncRoot) return ((IDictionary)new Dictionary(_innerDictionary, _innerDictionary.Comparer)).GetEnumerator(); } private void RequestSave() => _currentProfile?.InstanceRequestSaveProfile(); }