using System.ComponentModel; using System.IO; using System.Text.Json; namespace WinFormsApp.Utils { /// /// 配置文件读取工具类,支持泛型类型转换和默认值 /// public static class ConfigReader { private static JsonDocument? _configDocument; private static readonly object _lock = new object(); private static string _configFilePath = "appsettings.json"; /// /// 设置配置文件路径 /// /// 配置文件路径 public static void SetConfigPath(string filePath) { lock (_lock) { _configFilePath = filePath; _configDocument?.Dispose(); _configDocument = null; } } /// /// 加载配置文件 /// private static void LoadConfig() { if (_configDocument != null) return; lock (_lock) { if (_configDocument != null) return; try { if (!File.Exists(_configFilePath)) { Console.WriteLine($"配置文件不存在: {_configFilePath}"); return; } string jsonString = File.ReadAllText(_configFilePath); _configDocument = JsonDocument.Parse(jsonString); } catch (Exception ex) { Console.WriteLine($"加载配置文件失败: {ex.Message}"); } } } /// /// 获取配置值(泛型方法) /// /// 目标类型 /// 配置键,支持嵌套路径,如 "Module:Pattern" /// 默认值 /// 配置值或默认值 public static T GetValue(string key, T defaultValue = default(T)) { try { LoadConfig(); if (_configDocument == null) { return defaultValue; } JsonElement element = _configDocument.RootElement; string[] keys = key.Split(':'); // 遍历嵌套路径 foreach (string k in keys) { if (!element.TryGetProperty(k, out element)) { return defaultValue; } } return ConvertValue(element, defaultValue); } catch (Exception ex) { Console.WriteLine($"读取配置 '{key}' 时出错: {ex.Message}"); return defaultValue; } } /// /// 获取字符串配置值 /// /// 配置键 /// 默认值 /// 字符串值 public static string GetString(string key, string defaultValue = "") { return GetValue(key, defaultValue); } /// /// 获取整数配置值 /// /// 配置键 /// 默认值 /// 整数值 public static int GetInt(string key, int defaultValue = 0) { return GetValue(key, defaultValue); } /// /// 获取布尔配置值 /// /// 配置键 /// 默认值 /// 布尔值 public static bool GetBool(string key, bool defaultValue = false) { return GetValue(key, defaultValue); } /// /// 获取双精度浮点数配置值 /// /// 配置键 /// 默认值 /// 双精度浮点数值 public static double GetDouble(string key, double defaultValue = 0.0) { return GetValue(key, defaultValue); } /// /// 获取数组配置值 /// /// 数组元素类型 /// 配置键 /// 默认值 /// 数组值 public static T[] GetArray(string key, T[] defaultValue = null) { try { LoadConfig(); if (_configDocument == null) { return defaultValue ?? new T[0]; } JsonElement element = _configDocument.RootElement; string[] keys = key.Split(':'); // 遍历嵌套路径 foreach (string k in keys) { if (!element.TryGetProperty(k, out element)) { return defaultValue ?? new T[0]; } } if (element.ValueKind != JsonValueKind.Array) { return defaultValue ?? new T[0]; } List result = new List(); foreach (JsonElement item in element.EnumerateArray()) { T convertedValue = ConvertValue(item, default(T)); result.Add(convertedValue); } return result.ToArray(); } catch (Exception ex) { Console.WriteLine($"读取数组配置 '{key}' 时出错: {ex.Message}"); return defaultValue ?? new T[0]; } } /// /// 获取复杂对象配置值 /// /// 目标类型 /// 配置键 /// 默认值 /// 对象值 public static T GetObject(string key, T defaultValue = default(T)) where T : class { try { LoadConfig(); if (_configDocument == null) { return defaultValue; } JsonElement element = _configDocument.RootElement; string[] keys = key.Split(':'); // 遍历嵌套路径 foreach (string k in keys) { if (!element.TryGetProperty(k, out element)) { return defaultValue; } } return JsonSerializer.Deserialize(element.GetRawText()) ?? defaultValue; } catch (Exception ex) { Console.WriteLine($"读取对象配置 '{key}' 时出错: {ex.Message}"); return defaultValue; } } /// /// 类型转换方法 /// /// 目标类型 /// JSON元素 /// 默认值 /// 转换后的值 private static T ConvertValue(JsonElement element, T defaultValue) { try { Type targetType = typeof(T); Type nullableType = Nullable.GetUnderlyingType(targetType); // 处理可空类型 if (nullableType != null) { if (element.ValueKind == JsonValueKind.Null) { return defaultValue; } targetType = nullableType; } // 处理基本类型 switch (element.ValueKind) { case JsonValueKind.String: if (targetType == typeof(string)) return (T)(object)element.GetString(); break; case JsonValueKind.Number: if (targetType == typeof(int)) return (T)(object)element.GetInt32(); if (targetType == typeof(long)) return (T)(object)element.GetInt64(); if (targetType == typeof(double)) return (T)(object)element.GetDouble(); if (targetType == typeof(float)) return (T)(object)element.GetSingle(); if (targetType == typeof(decimal)) return (T)(object)element.GetDecimal(); break; case JsonValueKind.True: case JsonValueKind.False: if (targetType == typeof(bool)) return (T)(object)element.GetBoolean(); break; case JsonValueKind.Null: return defaultValue; } // 使用TypeConverter进行转换 TypeConverter converter = TypeDescriptor.GetConverter(targetType); if (converter.CanConvertFrom(typeof(string))) { string stringValue = element.GetRawText().Trim('"'); return (T)converter.ConvertFromString(stringValue); } // 尝试JSON反序列化 return JsonSerializer.Deserialize(element.GetRawText()) ?? defaultValue; } catch (Exception ex) { Console.WriteLine($"类型转换失败: {ex.Message}"); return defaultValue; } } /// /// 检查配置键是否存在 /// /// 配置键 /// 如果存在返回true,否则返回false public static bool HasKey(string key) { try { LoadConfig(); if (_configDocument == null) { return false; } JsonElement element = _configDocument.RootElement; string[] keys = key.Split(':'); foreach (string k in keys) { if (!element.TryGetProperty(k, out element)) { return false; } } return true; } catch { return false; } } /// /// 释放资源 /// public static void Dispose() { lock (_lock) { _configDocument?.Dispose(); _configDocument = null; } } } }