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();
}