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>