Customized IEnumerable in ConfigurationSection
我需要创建一个简单的自定义配置部分,其中包含IEnumerable。
我已经阅读了几篇文章和stackoverflow链接,举个简单的例子:如何在app.config中创建自定义配置节?
所以,我在控制台应用程序中有这个配置文件部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="Disk" type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection"/> </configSections> <Disk> <Paths> <Path name="one" permission="1" /> <Path name="two" permission="2" /> <Path name="three" permission="3" /> </Paths> </Disk> </configuration> |
接下来,我有了整个结构来管理配置部分:使用系统配置;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | namespace ConsoleApplication1_ConfigurationEnumerable { public class Path: ConfigurationElement { [ConfigurationProperty("name", IsRequired = true)] public string Name { get { return (string)this["name"]; } } [ConfigurationProperty("permission", IsRequired=true)] public string Permission { get { return (string)this["permission"]; } } } public class Paths: ConfigurationElementCollection { public Path this[int index] { get { return base.BaseGet(index) as Path; } set { if (base.BaseGet(index) != null) { base.BaseRemoveAt(index); } this.BaseAdd(index, value); } } protected override ConfigurationElement CreateNewElement() { return new Path(); } protected override object GetElementKey(ConfigurationElement element) { return ((Path)element).Name; } } public class PathsConfigSection : ConfigurationSection { public static PathsConfigSection GetConfig() { //return (PathsConfigSection)System.Configuration.ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection(); return (PathsConfigSection)System.Configuration.ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection(); } [ConfigurationProperty("Paths")] public Paths Paths { get { object o = this["Paths"]; return o as Paths; } } } } |
在这里,program.cs使用整个程序:使用系统;
2这里的问题在这两行中:
1 2 3 4 | //return (PathsConfigSection)System.Configuration // .ConfigurationManager.GetSection("Disk") ?? new PathsConfigSection(); return (PathsConfigSection)System.Configuration .ConfigurationManager.GetSection("Paths") ?? new PathsConfigSection(); |
如果我使用第二个(上面未注释),它将返回空值。
如果我使用注释的,那么它会抛出一个这样的异常:
0我的错在哪里?
在
1 2 3 4 | <configSections> <section name="Disk" type="ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection, ConsoleApplication1"/> </configSections> |
这假定您的程序集名称是
1 2 |
顺便说一句:您的名称空间很奇怪。命名标准建议在分隔命名空间层次结构时使用点(
我认为你应该使用第一行(注释掉的那一行)。问题出在配置文件中的