1

我一直在关注这个 Stackoverflow 主题。一切都在读取端工作。我得到一个集合,我将其转换为部分内容的字典。我将此发布到其他项目。当我尝试保存修改后的部分条目时会出现问题。其中一个外部项目发送了一个键/值对,我需要将它保存到我的部分。这是我的 App.Config

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
           <section name="fileEnvironmentSection" type="MyApp.Infrastructure.Configuration.FileEnvironmentSection, MyApp.Infrastructure"/>
        </configSections>

        <fileEnvironmentSection>
           <fileEnvironment>
             <add key="TestEntry1" value="A nice value"/> 
             <add key="TestEntry2" value="Another value"/> 
            </fileEnvironment>
        </fileEnvironmentSection>
     </configuration>

这是与配置部分交互所需的三层类型。

     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentSection : ConfigurationSection {

           [ConfigurationProperty("fileEnvironment", IsDefaultCollection = false)]
           [ConfigurationCollection(typeof(FileEnvironmentCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")]
           public FileEnvironmentCollection FileEnvironmentList {
              get { return (FileEnvironmentCollection)base["fileEnvironment"]; }
           }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentCollection : ConfigurationElementCollection {

           public FileEnvironmentElement this[int index] {
              get { return (FileEnvironmentElement)BaseGet(index); }
              set {
                 if(BaseGet(index) != null) BaseRemoveAt(index);
                 BaseAdd(index, value);
              }
           }

           public void Add(FileEnvironmentElement fileEnvironmentElement) { BaseAdd(fileEnvironmentElement); }

           public void Clear() { BaseClear(); }

           protected override ConfigurationElement CreateNewElement() { return new FileEnvironmentElement(); }

           protected override object GetElementKey(ConfigurationElement element) { return ((FileEnvironmentElement)element).Key; }

           public void Remove(FileEnvironmentElement fileEnvironmentElement) { BaseRemove(fileEnvironmentElement.Key); }

           public void Remove(string key) { BaseRemove(key); }

           public void RemoveAt(int index) { BaseRemoveAt(index); }
        }
     }


     using System.Configuration;

     namespace SlamDunk.Infrastructure.Configuration {
        public class FileEnvironmentElement : ConfigurationElement {

           private const string appConfigDefaultString = "missing";
           private const string _appConfigNameKey = "key";
           private const string _appConfigNameValue = "value";

           public FileEnvironmentElement() { }

           public FileEnvironmentElement(string key, string value) {
              Key = key;
              Value = value;
           }

           [ConfigurationProperty(_appConfigNameKey, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = true)]
           public string Key {
              get { return (string)this[_appConfigNameKey]; }
              set { this[_appConfigNameKey] = value; }
          }

           [ConfigurationProperty(_appConfigNameValue, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = false)]
          public string Value {
             get { return (string)this[_appConfigNameValue]; }
             set { this[_appConfigNameValue] = value; }
          }
        }
     }

这是我用来保存键/值更改的代码。

     var appConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     var fileEnvironmentSection = appConfiguration.GetSection("fileEnvironmentSection") as FileEnvironmentSection;
     var fileEnvironmentList = fileEnvironmentSection.FileEnvironmentList;
     fileEnvironmentList.Remove(key);
     var element = new FileEnvironmentElement(key, value);
     fileEnvironmentList.Add(element);

     //appConfiguration.Save(ConfigurationSaveMode.Modified);

     //fileEnvironmentSection.CurrentConfiguration.Save(ConfigurationSaveMode.Modified);

     fileEnvironmentList.CurrentConfiguration.Save(ConfigurationSaveMode.Modified);

我已经检查并且更改按预期显示在列表中。我已经尝试了两个注释保存调用以及最后一个。我想我得到了一个新的 FileEnvironmentSection 实例来避免 ConfigurationManager 缓存问题。每次测试运行后,我查看 MyApp.exe.config 并没有发现任何更改。我错过了一些东西,可以使用一些帮助来弄清楚什么。谢谢。

4

1 回答 1

3
appConfiguration.Save(ConfigurationSaveMode.Modified, true);

appConfiguration.Save(ConfigurationSaveMode.Full, true);

后者应该强制完全保存配置文件,我认为前者也会。我注意到您正在重新添加相同的密钥来收集,可能这就是为什么它没有被修改为拾取?

于 2012-01-21T22:01:16.830 回答