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