我对System.Configuration命名空间中的.NET配置类有疑问。我使用的是.NET 4.0。
我们有一个app.config文件的应用程序,并且该应用程序的用户能够提供user.config文件。应用程序使用“ConfigurationManager.OpenMappedExeConfiguration”使用配置文件的合并视图。
问题:
配置包含一个配置集合,其中各个集合项目也包含集合。在user.config中,我想修改其中一个“内部”集合中的配置元素。
示例:
假设我在app.config文件中有以下代码段:
<Adapters>
<Adapter Name='Adapter1' Type='Type1'>
<Parameters>
<add name='Parameter1' value='Value1' />
<add name='Parameter2' value='Value2' />
<add name='Parameter3' value='Value3' />
</Parameters>
</Adapter>
</Adapters>
现在我想在user.config文件中将Parameter3更改为其他值:
<Adapters>
<Adapter Name='Adapter1' Type='Type1'>
<Parameters>
<add name='Parameter3' value='NewValue3' />
</Parameters>
</Adapter>
</Adapters>
但是使用这个配置文件我会得到以下异常: “System.Configuration.ConfigurationErrorsException:条目'Adapter1'已被添加。”
以下user.config方法有效,但不太好:
<Adapters>
<remove Name='Adapter1' />
<Adapter Name='Adapter1' Type='Type1'>
<Parameters>
<add name='Parameter1' value='Value1' />
<add name='Parameter2' value='Value2' />
<add name='Parameter3' value='NewValue3' />
</Parameters>
</Adapter>
</Adapters>
我不喜欢这种方法的原因是你必须在user.config文件中重复Parameter1和Parameter2。 每次在app.config中引入新参数时,我都必须在user.config中添加它。
您知道更好的解决方案吗?
“适配器”集合在C#中定义如下:
[ConfigurationCollection(typeof(AdapterElement), AddItemName = "Adapter", CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
public class AdapterElementCollection : ConfigurationElementCollection
{
...
}
public class AdapterElement : ConfigurationElement
{
[ConfigurationProperty("Name", IsKey = true)]
public string Name
{
get
{
return (string)base["Name"];
}
set
{
base["Name"] = value;
}
}
[ConfigurationProperty("Type")]
public string Type
{
get
{
return (string)base["Type"];
}
set
{
base["Type"] = value;
}
}
[ConfigurationProperty("Parameters")]
public ConfigurableElementCollection Parameters
{
get
{
return (ConfigurableElementCollection)base["Parameters"];
}
set
{
base["Parameters"] = value;
}
}
}
“Parameters”集合定义如下:
[ConfigurationCollection(typeof(ConfigurableElement), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
public class ConfigurableElementCollection : ConfigurationElementCollection
{
...
}
public class ConfigurableElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true)]
public string Name
{
get
{
return (string)this["name"];
}
set
{
this["name"] = value;
}
}
[ConfigurationProperty("value")]
public string Value
{
get
{
return (string)this["value"];
}
set
{
this["value"] = value;
}
}
}