using System.Text.Json; using XFEExtension.NetCore.FormatExtension; namespace XFEExtension.NetCore.ProfileExtension; /// /// XFE配置文件,实现配置文件读写自动化 /// public abstract class XFEProfile { private static Func SaveProfilesFunc { get; set; } = p => JsonSerializer.Serialize(p.Property.GetValue(null)); private static Func LoadProfilesFunc { get; set; } = (x, p) => JsonSerializer.Deserialize(x, p.Property.PropertyType); /// /// 配置文件清单 /// public static List Profiles { get; private set; } = []; /// /// 配置文件所在的根目录 /// public static string ProfilesRootPath { get; set; } = $"{AppDomain.CurrentDomain.BaseDirectory}/Profiles"; /// /// 加载配置文件 /// /// /// public static void LoadProfiles(params ProfileInfo[] profileInfo) { Profiles.AddRange(profileInfo); foreach (var profile in Profiles) { if (!File.Exists(profile.Path)) continue; XFEDictionary propertyFileContent = File.ReadAllText(profile.Path); for (int i = 0; i < profile.PropertiesInfo.Count; i++) { for (int j = 0; j < propertyFileContent.Count; j++) { var propertyInfo = profile.PropertiesInfo[i]; var property = propertyFileContent.ElementAt(j); if (property.Header == propertyInfo.Name) { profile.PropertiesInfo[i].Property.SetValue(null, LoadProfilesFunc(property.Content, propertyInfo)); continue; } foreach (var propertySecFind in propertyFileContent) { if (propertySecFind.Header == propertyInfo.Name) { profile.PropertiesInfo[i].Property.SetValue(null, LoadProfilesFunc(propertySecFind.Content, propertyInfo)); break; } } } } } } /// /// 加载配置文件 /// /// /// public static async Task LoadProfilesAsync(params ProfileInfo[] profileInfo) => await Task.Run(() => LoadProfiles(profileInfo)); /// /// 储存指定的配置文件 /// /// 配置文件 /// public static void SaveProfile(ProfileInfo profileInfo) { var waitSaveProfile = Profiles.Find(x => x.Profile == profileInfo.Profile); if (waitSaveProfile is null) return; var saveProfileDictionary = new XFEDictionary(); foreach (var property in waitSaveProfile.PropertiesInfo) saveProfileDictionary.Add(property.Name, SaveProfilesFunc(property)); var fileSavePath = Path.GetDirectoryName(waitSaveProfile.Path); if (!Directory.Exists(fileSavePath) && fileSavePath is not null && fileSavePath != string.Empty) Directory.CreateDirectory(fileSavePath); File.WriteAllText(waitSaveProfile.Path, saveProfileDictionary); } /// /// 储存配置文件 /// /// public static void SaveProfiles() { foreach (var profile in Profiles) SaveProfile(profile); } /// /// 储存指定的配置文件 /// /// 配置文件 /// public static async Task SaveProfileAsync(ProfileInfo profileInfo) { var waitSaveProfile = Profiles.Find(x => x.Profile == profileInfo.Profile); if (waitSaveProfile is null) return; var saveProfileDictionary = new XFEDictionary(); foreach (var property in waitSaveProfile.PropertiesInfo) saveProfileDictionary.Add(property.Name, SaveProfilesFunc(property)); var fileSavePath = Path.GetDirectoryName(waitSaveProfile.Path); if (!Directory.Exists(fileSavePath) && fileSavePath is not null && fileSavePath != string.Empty) Directory.CreateDirectory(fileSavePath); await File.WriteAllTextAsync(waitSaveProfile.Path, saveProfileDictionary); } /// /// 储存配置文件 /// /// public static async Task SaveProfilesAsync() { foreach (var profile in Profiles) await SaveProfileAsync(profile); } /// /// 设置储存配置文件的方法 /// /// 储存方法 public static void SetSaveProfilesFunction(Func saveProfilesFunc) => SaveProfilesFunc = saveProfilesFunc; /// /// 设置加载配置文件的方法 /// /// 加载方法 public static void SetLoadProfilesFunction(Func loadProfilesFunc) => LoadProfilesFunc = loadProfilesFunc; /// /// 可写在属性的set访问器后,用于自动储存 /// /// /// protected static void AutoSave(ProfileInfo profileInfo) => SaveProfile(profileInfo); /// /// 可写在属性的set访问器后,用于自动储存 /// /// /// protected static async Task AutoSaveAsync(ProfileInfo profileInfo) => await SaveProfileAsync(profileInfo); }