Пользовательский раздел app.config с простым списком элементов «добавить»

Как создать пользовательский раздел app.config, который представляет собой простой список элементов add ?

Я нашел несколько примеров (например, как создать пользовательский раздел конфигурации в app.config? ) Для пользовательских разделов, которые выглядят следующим образом:

       

Но как мне избежать лишнего элемента коллекции («Компании»), чтобы он выглядел так же, как appSettings и connectionStrings ? Другими словами, я бы хотел:

     

Полный пример с кодом на основе файла конфигурации OP:

   

Вот пример кода для реализации настраиваемого раздела конфигурации с свернутой коллекцией

 using System.Configuration; namespace My { public class MyConfigSection : ConfigurationSection { [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)] public MyConfigInstanceCollection Instances { get { return (MyConfigInstanceCollection)this[""]; } set { this[""] = value; } } } public class MyConfigInstanceCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new MyConfigInstanceElement(); } protected override object GetElementKey(ConfigurationElement element) { //set to whatever Element Property you want to use for a key return ((MyConfigInstanceElement)element).Name; } } public class MyConfigInstanceElement : ConfigurationElement { //Make sure to set IsKey=true for property exposed as the GetElementKey above [ConfigurationProperty("name", IsKey = true, IsRequired = true)] public string Name { get { return (string) base["name"]; } set { base["name"] = value; } } [ConfigurationProperty("code", IsRequired = true)] public string Code { get { return (string) base["code"]; } set { base["code"] = value; } } } } 

Ниже приведен пример доступа к информации о конфигурации из кода.

 var config = ConfigurationManager.GetSection("registerCompanies") as MyConfigSection; Console.WriteLine(config["Tata Motors"].Code); foreach (var e in config.Instances) { Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); } 

Никакой настраиваемой секции конфигурации не требуется.

App.Config

    

извлекать

 // This casts to a NameValueCollection because the section is defined as a /// AppSettingsSection in the configSections. NameValueCollection settingCollection = (NameValueCollection)ConfigurationManager.GetSection("YourAppSettings"); var items = settingCollection.Count; Debug.Assert(items == 4); // no duplicates... the last one wins. Debug.Assert(settingCollection["duplicate"] == "bb"); // Just keys as per original question? done... use em. string[] allKeys = settingCollection.AllKeys; // maybe you did want key/value pairs. This is flexible to accommodate both. foreach (string key in allKeys) { Console.WriteLine(key + " : " + settingCollection[key]); } 

Основываясь на ответе Джей Уолкера выше, это полный рабочий пример, который добавляет возможность делать индексацию:

   

Вот пример кода для реализации настраиваемого раздела конфигурации с свернутой коллекцией

 using System.Configuration; using System.Linq; namespace My { public class MyConfigSection : ConfigurationSection { [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)] public MyConfigInstanceCollection Instances { get { return (MyConfigInstanceCollection)this[""]; } set { this[""] = value; } } } public class MyConfigInstanceCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new MyConfigInstanceElement(); } protected override object GetElementKey(ConfigurationElement element) { //set to whatever Element Property you want to use for a key return ((MyConfigInstanceElement)element).Name; } public new MyConfigInstanceElement this[string elementName] { get { return this.OfType().FirstOrDefault(item => item.Name == elementName); } } } public class MyConfigInstanceElement : ConfigurationElement { //Make sure to set IsKey=true for property exposed as the GetElementKey above [ConfigurationProperty("name", IsKey = true, IsRequired = true)] public string Name { get { return (string)base["name"]; } set { base["name"] = value; } } [ConfigurationProperty("code", IsRequired = true)] public string Code { get { return (string)base["code"]; } set { base["code"] = value; } } } } 

Ниже приведен пример доступа к информации о конфигурации из кода.

 MyConfigSection config = ConfigurationManager.GetSection("registerCompanies") as MyConfigSection; Console.WriteLine(config.Instances["Honda Motors"].Code); foreach (MyConfigInstanceElement e in config.Instances) { Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); } 

Основываясь на ответе Джея Уокера, доступ к элементам должен выполняться путем итерации через коллекцию «Экземпляры». то есть.

 var config = ConfigurationManager.GetSection("registerCompanies") as MyConfigSection; foreach (MyConfigInstanceElement e in config.Instances) { Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); } 

My.Assembly в config дал мне Exception, потому что я назвал проект «Мой» не «My.Assembly». Будьте осторожны, если вы используете этот пример!

  • Файл метаданных '.dll' не найден.
  • Вывод общего типа C # 3.0 - передача делегата в качестве параметра функции
  • Отличный () с лямбдой?
  • Почему свойства анонимных типов в C # доступны только для чтения?
  • При использовании инициализаторов объектов, почему компилятор генерирует дополнительную локальную переменную?
  • Методы расширения требуют объявления classа статическим
  • Как получить индекс с помощью LINQ?
  • System.Drawing.Image для streamа C #
  • Как установить стиль WPF Window Style в app.xaml?
  • Делегат Func с переменной ref
  • Преобразование целых чисел в римские цифры
  • Давайте будем гением компьютера.