c# custom-configuration

c# - ¿Cómo hago para que mi sección de configuración personalizada se comporte como una colección?



custom-configuration (1)

Supongo que la collection es una propiedad de su clase personalizada ConfigurationSection .

Puedes decorar esta propiedad con los siguientes atributos:

[ConfigurationProperty("", IsDefaultCollection = true)] [ConfigurationCollection(typeof(MyElementCollection), AddItemName = "element")]

Una implementación completa para su ejemplo podría verse así:

public class MyCustomSection : ConfigurationSection { [ConfigurationProperty("", IsDefaultCollection = true)] [ConfigurationCollection(typeof(MyElementCollection), AddItemName = "element")] public MyElementCollection Elements { get { return (MyElementCollection)this[""]; } } } public class MyElementCollection : ConfigurationElementCollection, IEnumerable<MyElement> { private readonly List<MyElement> elements; public MyElementCollection() { this.elements = new List<MyElement>(); } protected override ConfigurationElement CreateNewElement() { var element = new MyElement(); this.elements.Add(element); return element; } protected override object GetElementKey(ConfigurationElement element) { return ((MyElement)element).Name; } public new IEnumerator<MyElement> GetEnumerator() { return this.elements.GetEnumerator(); } } public class MyElement : ConfigurationElement { [ConfigurationProperty("name", IsKey = true, IsRequired = true)] public string Name { get { return (string)this["name"]; } } }

Ahora puedes acceder a tu configuración de esta manera:

var config = (MyCustomSection)ConfigurationManager.GetSection("customSection"); foreach (MyElement el in config.Elements) { Console.WriteLine(el.Name); }

Esto permitirá la siguiente sección de configuración:

<customSection> <element name="A" /> <element name="B" /> <element name="C" /> <customSection>

¿Cómo necesitaría escribir mi ConfigurationSection personalizado para que sea tanto un controlador de sección como una colección de elementos de configuración?

Normalmente, tiene una clase que hereda de ConfigurationSection , que luego tiene una propiedad de un tipo que hereda de ConfigurationElementCollection , que luego devuelve elementos de una colección de un tipo que hereda de ConfigurationElement . Para configurar eso, entonces necesitarías un XML que se vea así:

<customSection> <collection> <element name="A" /> <element name="B" /> <element name="C" /> </collection> </customSection>

Quiero cortar el nodo <collection> , y solo tengo:

<customSection> <element name="A" /> <element name="B" /> <element name="C" /> <customSection>