在覆盖.NET配置文件时,我可以修改集合集合吗?

时间:2014-05-14 15:32:18

标签: c# .net configuration-files configurationmanager

我对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;
        }
    }
}

0 个答案:

没有答案