using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Xml.Serialization;
using XFEExtension.NetCore.FormatExtension;
namespace XFEExtension.NetCore.AutoConfig;
///
/// XFE配置文件,实现配置文件读写自动化
///
public abstract class XFEProfile
{
private string id = Guid.NewGuid().ToString();
///
/// 配置文件所在的默认目录
///
public static string ProfilesDefaultPath { get; set; } = $@"{AppDomain.CurrentDomain.BaseDirectory}Profiles";
///
/// 配置文件存储位置
///
internal protected string CurrentProfilePath { get; set; } = string.Empty;
///
/// 配置文件扩展名
///
internal protected string CurrentProfileExtension { get; set; } = ".xpf";
///
/// 默认配置文件存储和读取的操作模式
///
internal protected ProfileOperationMode DefaultProfileOperationMode { get; set; } = ProfileOperationMode.XFEDictionary;
///
/// 加载操作
///
internal protected ProfileLoadOperation LoadOperation { get; set; } = XFEDictionaryLoadProfileOperation;
///
/// 保存操作
///
internal protected ProfileSaveOperation SaveOperation { get; set; } = XFEDictionarySaveProfileOperation;
///
/// 配置文件 “属性名称-属性类型” 字典
///
internal protected Dictionary PropertyInfoDictionary { get; set; } = [];
///
/// 配置文件 “属性名称-属性设置方法” 字典
///
internal protected Dictionary PropertySetFuncDictionary { get; set; } = [];
///
/// 配置文件 “属性名称-属性获取方法” 字典
///
internal protected Dictionary PropertyGetFuncDictionary { get; set; } = [];
///
/// 通过XFE字典加载配置文件方法(默认)
///
/// 配置文件实例
/// 配置文件字符串
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性设置方法” 字典
/// 配置文件实例
public static XFEProfile? XFEDictionaryLoadProfileOperation(XFEProfile profileInstance, string profileString, Dictionary propertyInfoDictionary, Dictionary propertySetFuncDictionary)
{
XFEDictionary propertyFileContent = profileString;
foreach (var property in propertyFileContent)
if (propertySetFuncDictionary.TryGetValue(property.Header, out var setValueDelegate) && propertyInfoDictionary.TryGetValue(property.Header, out var type))
setValueDelegate(JsonSerializer.Deserialize(property.Content, type));
return null;
}
///
/// 通过XFE字典保存配置文件方法(默认)
///
/// 配置文件实例
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性值获取方法” 字典
/// 保存内容
public static string XFEDictionarySaveProfileOperation(XFEProfile profileInstance, Dictionary propertyInfoDictionary, Dictionary propertyGetFuncDictionary)
{
if (profileInstance is null)
return string.Empty;
var saveProfileDictionary = new XFEDictionary();
foreach (var property in propertyGetFuncDictionary)
saveProfileDictionary.Add(property.Key, JsonSerializer.Serialize(property.Value()));
return saveProfileDictionary.ToString();
}
///
/// 通过Json加载配置文件方法
///
/// 配置文件实例
/// 配置文件字符串
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性设置方法” 字典
/// 配置文件实例
public static XFEProfile? JsonLoadProfileOperation(XFEProfile profileInstance, string profileString, Dictionary propertyInfoDictionary, Dictionary propertySetFuncDictionary) => JsonSerializer.Deserialize(profileString, profileInstance.GetType()) is XFEProfile xFEProfile ? xFEProfile : null;
///
/// 通过Json保存配置文件方法
///
/// 配置文件实例
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性值获取方法” 字典
/// 保存内容
public static string JsonSaveProfileOperation(XFEProfile profileInstance, Dictionary propertyInfoDictionary, Dictionary propertyGetFuncDictionary) => profileInstance is null ? string.Empty : JsonSerializer.Serialize(profileInstance, profileInstance.GetType());
///
/// 通过XML加载配置文件方法
///
/// 配置文件实例
/// 配置文件字符串
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性设置方法” 字典
/// 配置文件实例
public static XFEProfile? XmlLoadProfileOperation(XFEProfile profileInstance, string profileString, Dictionary propertyInfoDictionary, Dictionary propertySetFuncDictionary) => !string.IsNullOrEmpty(profileString) && new XmlSerializer(profileInstance.GetType()).Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(profileString))) is XFEProfile xFEProfile ? xFEProfile : null;
///
/// 通过XML保存配置文件方法
///
/// 配置文件实例
/// 配置文件 “属性名称-属性类型” 字典
/// 配置文件 “属性名称-属性值获取方法” 字典
/// 保存内容
public static string XmlSaveProfileOperation(XFEProfile profileInstance, Dictionary propertyInfoDictionary, Dictionary propertyGetFuncDictionary)
{
if (profileInstance is null)
return string.Empty;
using var stream = new MemoryStream();
new XmlSerializer(profileInstance.GetType()).Serialize(stream, profileInstance);
stream.Position = 0;
return new StreamReader(stream).ReadToEnd();
}
///
/// 加载配置文件
///
/// 配置文件实例
internal protected XFEProfile InstanceLoadProfile()
{
if (File.Exists(CurrentProfilePath) && LoadOperation(this, File.ReadAllText(CurrentProfilePath), PropertyInfoDictionary, PropertySetFuncDictionary) is XFEProfile xFEProfile)
{
xFEProfile.Initialize();
return xFEProfile;
}
return this;
}
///
/// 保存配置文件
///
/// 保存内容
internal protected void InstanceSaveProfile()
{
var saveContent = SaveOperation(this, PropertyInfoDictionary, PropertyGetFuncDictionary);
var fileSavePath = Path.GetDirectoryName(CurrentProfilePath);
if (!Directory.Exists(fileSavePath) && fileSavePath is not null && fileSavePath != string.Empty)
Directory.CreateDirectory(fileSavePath);
File.WriteAllTextAsync(CurrentProfilePath, saveContent);
return;
}
///
/// 删除配置文件
///
internal protected void InstanceDeleteProfile()
{
if (File.Exists(CurrentProfilePath))
File.Delete(CurrentProfilePath);
}
///
/// 导出配置文件
///
///
internal protected string InstanceExportProfile() => SaveOperation(this, PropertyInfoDictionary, PropertyGetFuncDictionary);
///
/// 导入配置文件
///
/// 配置文件字符串
///
internal protected XFEProfile InstanceImportProfile(string profileString)
{
if (LoadOperation(this, profileString, PropertyInfoDictionary, PropertySetFuncDictionary) is XFEProfile xFEProfile)
{
xFEProfile.Initialize();
return xFEProfile;
}
return this;
}
///
/// 设置配置文件加载和存储操作
///
internal protected void SetProfileOperation()
{
switch (DefaultProfileOperationMode)
{
case ProfileOperationMode.XFEDictionary:
LoadOperation = XFEDictionaryLoadProfileOperation;
SaveOperation = XFEDictionarySaveProfileOperation;
CurrentProfileExtension = ".xpf";
break;
case ProfileOperationMode.Json:
LoadOperation = JsonLoadProfileOperation;
SaveOperation = JsonSaveProfileOperation;
CurrentProfileExtension = ".json";
break;
case ProfileOperationMode.Xml:
LoadOperation = XmlLoadProfileOperation;
SaveOperation = XmlSaveProfileOperation;
CurrentProfileExtension = ".xml";
break;
case ProfileOperationMode.Custom:
break;
default:
break;
}
}
///
/// 初始化
///
public virtual void Initialize() => SetProfileOperation();
#region 已过时
[Obsolete("SaveProfilesFunc属性现已过时,对于每个配置文件实例,请使用 XXXProfile.SaveOperation")]
private static Func