# ICfgSection API `ICfgSection` 是配置节接口,表示配置的一个子节。 ## 接口定义 ```csharp public interface ICfgSection { /// /// 配置节的完整路径 /// string Path { get; } /// /// 获取子配置值 /// string? Get(string key); /// /// 获取类型化的子配置值 /// T? Get(string key); /// /// 检查配置键是否存在 /// bool Exists(string key); /// /// 设置子配置值 /// void Set(string key, string? value, int? targetLevel = null); /// /// 移除配置键 /// void Remove(string key, int? targetLevel = null); /// /// 获取子配置节 /// ICfgSection GetSection(string key); /// /// 获取所有子键 /// IEnumerable GetChildKeys(); } ``` ## 属性 ### Path 配置节的完整路径。 ```csharp var dbSection = cfg.GetSection("Database"); Console.WriteLine(dbSection.Path); // 输出: Database var portSection = dbSection.GetSection("Port"); Console.WriteLine(portSection.Path); // 输出: Database:Port ``` ## 方法 ### Get ```csharp string? Get(string key) ``` 获取子配置的值。 **参数:** - `key`: 子配置键(相对于此节的键名) **返回:** 配置值,如果不存在返回 `null` **示例:** ```csharp var dbSection = cfg.GetSection("Database"); var host = dbSection.Get("Host"); // 等同于 cfg.Get("Database:Host") var port = dbSection.Get("Port"); // 等同于 cfg.Get("Database:Port") ``` ### Get<T> ```csharp T? Get(string key) ``` 获取子配置的类型化值。 **参数:** - `key`: 子配置键 **返回:** 转换后的值,不存在或转换失败时返回默认值 **示例:** ```csharp var dbSection = cfg.GetSection("Database"); var port = dbSection.Get("Port"); // 等同于 cfg.Get("Database:Port") var timeout = dbSection.Get("Timeout"); // 等同于 cfg.Get("Database:Timeout") ``` ### Exists ```csharp bool Exists(string key) ``` 检查配置键是否存在。 **参数:** - `key`: 子配置键(相对于此节的键名) **返回:** 存在返回 `true`,否则返回 `false` **示例:** ```csharp var dbSection = cfg.GetSection("Database"); if (dbSection.Exists("ConnectionString")) { var connStr = dbSection.Get("ConnectionString"); // 处理连接字符串 } if (dbSection.Exists("Password")) { // 使用密码 } else { // 使用默认认证 } ``` ### Set ```csharp void Set(string key, string? value, int? targetLevel = null) ``` 设置子配置值。 **参数:** - `key`: 子配置键 - `value`: 配置值 - `targetLevel`: 目标层级(可选,默认写入可写的最高层级) **示例:** ```csharp var dbSection = cfg.GetSection("Database"); dbSection.Set("Host", "new-host"); // 等同于 cfg.Set("Database:Host", "new-host") dbSection.Set("Port", "5433"); // 等同于 cfg.Set("Database:Port", "5433") ``` ### Remove ```csharp void Remove(string key, int? targetLevel = null) ``` 移除配置键。 **参数:** - `key`: 子配置键(相对于此节的键名) - `targetLevel`: 目标层级(可选,为 null 时从所有层级移除) **示例:** ```csharp var dbSection = cfg.GetSection("Database"); dbSection.Remove("OldSetting"); // 等同于 cfg.Remove("Database:OldSetting") dbSection.Remove("TempValue", targetLevel: 1); // 只从层级1移除 ``` ### GetSection ```csharp ICfgSection GetSection(string key) ``` 获取子配置节。 **参数:** - `key`: 子配置节键 **返回:** `ICfgSection` 子配置节 **示例:** ```csharp var servicesSection = cfg.GetSection("Services"); var apiSection = servicesSection.GetSection("Api"); // 等同于 cfg.GetSection("Services:Api") var url = apiSection.Get("Url"); ``` ### GetChildKeys ```csharp IEnumerable GetChildKeys() ``` 获取所有直接子键。 **返回:** 子键集合 **示例:** ```csharp var dbSection = cfg.GetSection("Database"); foreach (var key in dbSection.GetChildKeys()) { Console.WriteLine($"{key} = {dbSection.Get(key)}"); } // 输出: // Host = localhost // Port = 5432 // Database = mydb ``` ## 使用示例 ### 基本用法 ```csharp var cfg = new CfgBuilder() .AddJson("config.json", level: 0, writeable: false) .Build(); // 获取配置节 var dbSection = cfg.GetSection("Database"); // 读取值 var host = dbSection.Get("Host"); var port = dbSection.Get("Port"); // 检查键是否存在 if (dbSection.Exists("Password")) { var password = dbSection.Get("Password"); } // 遍历子键 foreach (var key in dbSection.GetChildKeys()) { Console.WriteLine($"{key}: {dbSection.Get(key)}"); } ``` ### 嵌套配置节 ```csharp // JSON: { "Services": { "Api": { "Url": "...", "Timeout": 30 } } } var apiSection = cfg.GetSection("Services:Api"); // 或 var apiSection = cfg.GetSection("Services").GetSection("Api"); var url = apiSection.Get("Url"); var timeout = apiSection.Get("Timeout"); ``` ### 修改配置节 ```csharp var cfg = new CfgBuilder() .AddJson("config.json", level: 0, writeable: true, isPrimaryWriter: true) .Build(); var dbSection = cfg.GetSection("Database"); // 设置值 dbSection.Set("Host", "new-host"); dbSection.Set("Port", "5433"); // 移除旧配置 dbSection.Remove("DeprecatedSetting"); await cfg.SaveAsync(); ``` ### 处理数组配置 ```csharp // JSON: { "Servers": ["s1", "s2", "s3"] } var serversSection = cfg.GetSection("Servers"); foreach (var key in serversSection.GetChildKeys()) { var server = serversSection.Get(key); Console.WriteLine($"Server {key}: {server}"); } // 输出: // Server 0: s1 // Server 1: s2 // Server 2: s3 ``` ### 处理对象数组 ```csharp // JSON: { "Endpoints": [{ "Name": "api", "Url": "..." }, { "Name": "auth", "Url": "..." }] } var endpointsSection = cfg.GetSection("Endpoints"); foreach (var key in endpointsSection.GetChildKeys()) { var endpoint = endpointsSection.GetSection(key); var name = endpoint.Get("Name"); var url = endpoint.Get("Url"); Console.WriteLine($"Endpoint {name}: {url}"); } ``` ### 检查配置节是否存在 ```csharp var optionalSection = cfg.GetSection("Optional"); var childKeys = optionalSection.GetChildKeys().ToList(); if (childKeys.Count > 0 || optionalSection.Exists("Value")) { // 配置节存在且有内容 } ``` ### 条件配置处理 ```csharp var featureSection = cfg.GetSection("Features"); // 检查功能是否启用 if (featureSection.Exists("NewUI") && featureSection.Get("NewUI")) { // 启用新 UI } // 获取可选配置,带默认值 var maxRetries = featureSection.Exists("MaxRetries") ? featureSection.Get("MaxRetries") : 3; ``` ## 下一步 - [扩展方法](/api/extensions) - 所有扩展方法参考 - [示例](/examples/) - 更多使用示例