C# 在运行时添加自定义配置元素

C# 在运行时添加自定义配置元素,c#,runtime,app-config,custom-configuration,C#,Runtime,App Config,Custom Configuration,是否可以在运行时添加自定义配置元素 这是我的app.config文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="NodeList" type="Configuration.NodeListSection, NodeListConfiguration"

是否可以在运行时添加自定义配置元素

这是我的app.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="NodeList"
               type="Configuration.NodeListSection, NodeListConfiguration"
               requirePermission="false" />
  </configSections>
  <NodeList>
    <nodes>
      <add name="Dev1" isdefault="false" description ="Dev server" />
      <add name="QA1" isdefault="true" description="QA server"/>
      <add name="Prod1" isdefault="false" description="Production" />
    </nodes>
  </NodeList>
</configuration>

我们可以使用C代码在运行时添加更多节点吗

您发布的文件看起来不像普通的.NET配置文件,而是自定义XML文件

在任何一种情况下-.config文件都只是XML文件-您可以使用BCL中的任何XML库打开、操作和保存它们,例如


但是,如果您想在运行时更改配置,则需要决定应用程序是否也应在运行时应用这些更改,并为此编写代码,因为通常只有在启动时才会读取配置文件。

这似乎不是来自内置配置节。您会发现NodeList是一个自定义编写的节/元素。要确定它在代码库中的位置,请在configSections元素的配置文件顶部查找NodeList。这将为你指明要调查的班级

之后,您需要该类正确地支持写操作

要了解更多有关自定义配置文件的信息,请参阅本主题的。特别是,关于的部分应该对您有所帮助

将更多信息添加到问题后编辑:

尝试类似的方法,当然这取决于NodeListSection代码库中的内容:

using Configuration;

var nodeListSection = ConfigurationManager.GetSection("NodeList") as Configuration.NodeListSection;
var newNode = new NodeElement() { Name = "xyz", IsDefault = false, Description = "New Guy" };
nodeListSection.Nodes.Add(newNode);

Configuration.Save(ConfigurationSaveMode.Modified);

这看起来不像标准的.NET配置文件。您从何处获得此架构?感谢您提供的解决方案。我找不到添加新NodeElement的Add方法。nodeListSection.Nodes.AddnewNode;嗯,你必须仔细研究一下节点的类型才能得出结论。很可能它是ConfigurationElementCollection的派生--这意味着BaseAdd是受保护的,除非显式重写使您的任务变得更难…我能够添加一个公共方法并将元素传递给受保护的重写,但是保存后,我看不到App.config文件中的更改。请查看并向下滚动一点,以查看有关修改状态和取消合并操作的讨论。这可能会帮你指明正确的方向!您可以使用此代码在配置文件中添加新的密钥和值。
    private void AddNewKey_Config(string key, string value, string fileName)
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(fileName);
        configFile.AppSettings.Settings.Add(key, value);
        configFile.Save();
    }