C# App.Config无法读取courses集合值,报错‘未识别元素courses’
解决配置文件中“未识别元素‘courses’”的异常问题
我帮你找到了问题的核心,咱们一步步来修复这个异常:
问题根源
你遇到的ConfigurationErrorsException: 未识别元素“courses”异常,本质是你的配置类结构和App.Config的节点结构不匹配:
- App.Config里的
<courses>是<school>的直接子节点,但你的SchoolConfig类(对应<school>节点)并没有定义对应这个节点的属性 - 你错误地把
Courses集合属性放在了CourseElement类里,而单个<course>节点根本不需要包含课程集合,这完全不符合配置的层级关系
解决方案步骤
1. 修改SchoolConfig类,添加<courses>节点的对应属性
在SchoolConfig中新增一个ConfigurationProperty属性,类型为CourseElementCollection,对应配置文件里的<courses>节点:
public class SchoolConfig : ConfigurationSection { private static SchoolConfig _schoolConfig = (SchoolConfig)ConfigurationManager.GetSection("school"); public static SchoolConfig Settings { get { return _schoolConfig; } } [ConfigurationProperty("name")] public string Name { get { return (string)base["name"]; } } [ConfigurationProperty("address")] public AddressElement Address { get { return (AddressElement)base["address"]; } } // 新增:对应配置文件中的<courses>节点 [ConfigurationProperty("courses")] public CourseElementCollection Courses { get { return (CourseElementCollection)base["courses"]; } } }
2. 移除CourseElement类中错误的Courses属性
单个课程节点不需要包含课程集合,把这段代码从CourseElement里删掉:
// 删掉这段错误的代码 [ConfigurationProperty("courses")] public CourseElementCollection Courses { get { return (CourseElementCollection)base["courses"]; } }
修改后的CourseElement类应该是这样:
public class CourseElement : ConfigurationElement { [ConfigurationProperty("title", IsRequired = true)] public string Title { get { return (string)base["title"]; } } [ConfigurationProperty("instructor", IsRequired = false)] public string Instructor { get { return (string)base["instructor"]; } } }
测试修改后的代码
更新你的Main方法,现在可以正常读取课程列表了:
static void Main(string[] args) { string schoolName = SchoolConfig.Settings.Name; string schoolStreet = SchoolConfig.Settings.Address.Street; string schoolCity = SchoolConfig.Settings.Address.City; string schoolState = SchoolConfig.Settings.Address.State; Console.WriteLine("School Name: {0} ", schoolName); Console.WriteLine("School Address: {0}, {1}, {2} ", schoolStreet, schoolCity, schoolState); // 读取并输出课程信息 Console.WriteLine("\nCourses Offered:"); foreach (CourseElement course in SchoolConfig.Settings.Courses) { string instructorInfo = string.IsNullOrEmpty(course.Instructor) ? "No instructor specified" : $"Instructor: {course.Instructor}"; Console.WriteLine("- {0} | {1}", course.Title, instructorInfo); } Console.WriteLine("\r\nDone"); Console.ReadLine(); }
为什么这样改能解决问题
.NET的配置系统要求配置类的结构必须和XML配置节点的层级完全对应:
<school>→SchoolConfig类<school>下的<address>→SchoolConfig里的Address属性(类型AddressElement)<school>下的<courses>→SchoolConfig里的Courses属性(类型CourseElementCollection)<courses>下的每个<course>→CourseElement类,由CourseElementCollection管理
这样修改后,配置系统就能正确解析<courses>节点,不会再抛出“未识别元素”的异常了。
内容的提问来源于stack exchange,提问作者theDoron1
相关产品推荐
相关产品推荐

