有一个很棒的问题和答案here说明了如何创建一个自定义配置部分,该部分能够将以下表单的配置解析为.Net对象:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="CustomConfigSection" type="ConfigTest.CustomConfigSection,ConfigTest" />
</configSections>
<CustomConfigSection>
<ConfigElements>
<ConfigElement key="Test1" />
<ConfigElement key="Test2" />
</ConfigElements>
</CustomConfigSection>
</configuration>
我的问题是,有没有人知道如何在没有ConfigElements
元素的情况下创建相同的自定义配置部分?例如,可以解析以下CustomConfigSection
元素代替上面显示的元素:
<CustomConfigSection>
<ConfigElement key="Test1" />
<ConfigElement key="Test2" />
</CustomConfigSection>
我遇到的问题是,CustomConfigSection
类似乎需要从ConfigurationSection和ConfigurationElementCollection继承,这当然在C#中是不可能的。我发现的另一种方法要求我实现IConfigurationSectionHandler,从.Net v2开始不推荐使用。有谁知道如何达到预期的效果?感谢。
答案 0 :(得分:12)
您不需要从ConfigurationSection和ConfigurationElementCollection继承。相反,请按以下方式定义配置部分:
public class CustomConfigSection : ConfigurationSection
{
[ConfigurationProperty("", IsDefaultCollection = true)]
public MyConfigElementCollection ConfigElementCollection
{
get
{
return (MyConfigElementCollection)base[""];
}
}
}
你的配置元素集合:
[ConfigurationCollection(typeof(MyConfigElement), AddItemName = "ConfigElement"]
public class MyConfigElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new MyConfigElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
if (element == null)
throw new ArgumentNullException("element");
return ((MyConfigElement)element).key;
}
}
配置元素本身:
public class MyConfigElement: ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true, IsKey = true)]
public string Key
{
get
{
return (string)base["key"];
}
}
}