自定义配置部分包含集合

我无法让自定义配置部分工作。 这是我从网上获得的一些代码,试图更好地理解这个区域,让我能够到达我想要的最终位置,我自己的自定义配置部分。

我在控制台应用程序中运行代码时得到的错误是“ 无法识别的属性”扩展名。 请注意,属性名称区分大小写。

主要应用程序中的代码是为了让事情顺利进行

var conf = ConfigurationManager.GetSection("uploadDirector"); 

这就是exception出现的地方。

这是我希望/试图实现的配置部分

           

这是我从网上获得的代码

.config文件

            

UploadDirectorConfigSection.cs

 public class UploadDirectorConfigSection : ConfigurationSection { private string _rootPath; public UploadDirectorConfigSection() { } [ConfigurationProperty("rootpath", DefaultValue="/", IsRequired=false, IsKey=false)] [StringValidator(InvalidCharacters=@"~!.@#$%^&*()[]{};'\|\\")] public string RootPath { get { return _rootPath; } set { _rootPath = value; } } [ConfigurationProperty("", IsRequired = true, IsKey = false, IsDefaultCollection = true)] public FileGroupCollection FileGroups { get { return (FileGroupCollection) base[""]; } set { base[""] = value; } } } 

FileGroupCollection.cs

 public class FileGroupCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FileGroupElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((FileGroupElement) element).Name; } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override string ElementName { get { return "filegroup"; } } protected override bool IsElementName(string elementName) { if (string.IsNullOrWhiteSpace(elementName) || elementName != "filegroup") return false; return true; } public FileGroupElement this[int index] { get { return (FileGroupElement) BaseGet(index); } set { if(BaseGet(index) != null) BaseRemoveAt(index); BaseAdd(index, value); } } } 

FileGroupElement.cs

 public class FileGroupElement : ConfigurationElement { [ConfigurationProperty("name", IsKey=true, IsRequired = true)] [StringValidator(InvalidCharacters = @" ~.!@#$%^&*()[]{}/;'""|\")] public string Name { get { return (string) base["name"]; } set { base["name"] = value; } } [ConfigurationProperty("defaultDirectory", DefaultValue = ".")] public string DefaultDirectory { get { return (string) base["Path"]; } set { base["Path"] = value; } } [ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)] public FileInfoCollection Files { get { return (FileInfoCollection) base[""]; } } } 

FileInfoCollection.cs

 public class FileInfoCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FileInfoCollection(); } protected override object GetElementKey(ConfigurationElement element) { return ((FileInfoElement) element).Extension; } } 

FileInfoElement.cs

 public class FileInfoElement : ConfigurationElement { public FileInfoElement() { Extension = "txt"; Mime = "text/plain"; MaxSize = 0; } [ConfigurationProperty("extension", IsKey = true, IsRequired = true)] public string Extension { get { return (string)base["extension"]; } set { base["extension"] = value; } } [ConfigurationProperty("mime", DefaultValue = "text/plain")] public string Mime { get { return (string) base["mime"]; } set { base["mime"] = value; } } [ConfigurationProperty("maxsize", DefaultValue = 0)] public int MaxSize { get { return (int) base["maxsize"]; } set { base["maxsize"] = value; } } } 

CreateNewElement方法中定义FileInfoCollection ,您创建了错误的FileInfoCollection 。 重写的CreateNewElement应该返回新的集合元素,而不是新的集合:

 public class FileInfoCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FileInfoElement(); } protected override object GetElementKey (ConfigurationElement element) { return ((FileInfoElement)element).Extension; } } 

关于您所需的配置,最简单的实现可能如下所示:

 public class AuthorisedClientsSection : ConfigurationSection { [ConfigurationProperty("", IsDefaultCollection = true)] public AuthorisedClientElementCollection Elements { get { return (AuthorisedClientElementCollection)base[""];} } } public class AuthorisedClientElementCollection : ConfigurationElementCollection { const string ELEMENT_NAME = "AuthorisedClient"; public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override string ElementName { get { return ELEMENT_NAME; } } protected override ConfigurationElement CreateNewElement() { return new AuthorisedClientElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((AuthorisedClientElement)element).Name; } } public class AuthorisedClientElement : ConfigurationElement { const string NAME = "name"; [ConfigurationProperty(NAME, IsRequired = true)] public string Name { get { return (string)base[NAME]; } } [ConfigurationProperty("", IsDefaultCollection = true)] public QueueElementCollection Elements { get { return (QueueElementCollection)base[""]; } } } public class QueueElementCollection : ConfigurationElementCollection { const string ELEMENT_NAME = "Queue"; public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override string ElementName { get { return ELEMENT_NAME; } } protected override ConfigurationElement CreateNewElement() { return new QueueElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((QueueElement)element).Id; } } public class QueueElement : ConfigurationElement { const string ID = "id"; [ConfigurationProperty(ID, IsRequired = true)] public int Id { get { return (int)base[ID]; } } } 

而且测试:

 var authorisedClientsSection = ConfigurationManager.GetSection("AuthorisedClients") as AuthorisedClientsSection; foreach (AuthorisedClientElement client in authorisedClientsSection.Elements) { Console.WriteLine("Client: {0}", client.Name); foreach (QueueElement queue in client.Elements) { Console.WriteLine("\tQueue: {0}", queue.Id); } }