Jak utworzyć niestandardową sekcję app.config, która jest tylko prostą listą add
elementów?
Znalazłem kilka przykładów (np. Jak utworzyć niestandardową sekcję konfiguracji w app.config? ) Dla niestandardowych sekcji, które wyglądają tak:
<RegisterCompanies>
<Companies>
<Company name="Tata Motors" code="Tata"/>
<Company name="Honda Motors" code="Honda"/>
</Companies>
</RegisterCompanies>
Ale jak uniknąć dodatkowego elementu kolekcji („Firmy”), aby wyglądał tak samo jak sekcje appSettings
i connectionStrings
? Innymi słowy, chciałbym:
<registerCompanies>
<add name="Tata Motors" code="Tata"/>
<add name="Honda Motors" code="Honda"/>
</registerCompanies>
c#
app-config
Joe Daley
źródło
źródło
Odpowiedzi:
Pełny przykład z kodem opartym na pliku konfiguracyjnym OP:
<configuration> <configSections> <section name="registerCompanies" type="My.MyConfigSection, My.Assembly" /> </configSections> <registerCompanies> <add name="Tata Motors" code="Tata"/> <add name="Honda Motors" code="Honda"/> </registerCompanies> </configuration>
Oto przykładowy kod implementujący niestandardową sekcję konfiguracji ze zwiniętą kolekcją
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; } } } }
Oto przykład, jak uzyskać dostęp do informacji konfiguracyjnych z kodu.
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); }
źródło
<configSection>
powinien znajdować się tuż po<configuration>
tagu, aby działał!Nie jest wymagana żadna niestandardowa sekcja konfiguracji.
App.Config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="YourAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </configSections> <!-- value attribute is optional. omit if you just want a list of 'keys' --> <YourAppSettings> <add key="one" value="1" /> <add key="two" value="2"/> <add key="three" value="3"/> <add key="duplicate" value="aa"/> <add key="duplicate" value="bb"/> </YourAppSettings> </configuration>
Odzyskać
// 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]); }
źródło
W oparciu o powyższą odpowiedź Jaya Walkera , jest to kompletny przykład roboczy, który dodaje możliwość indeksowania:
<configuration> <configSections> <section name="registerCompanies" type="My.MyConfigSection, My.Assembly" /> </configSections> <registerCompanies> <add name="Tata Motors" code="Tata"/> <add name="Honda Motors" code="Honda"/> </registerCompanies> </configuration>
Oto przykładowy kod implementujący niestandardową sekcję konfiguracji ze zwiniętą kolekcją
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<MyConfigInstanceElement>().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; } } } }
Oto przykład, jak uzyskać dostęp do informacji konfiguracyjnych z kodu.
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); }
źródło
Zgodnie z odpowiedzią Jaya Walkera dostęp do elementów należy wykonać, przechodząc przez kolekcję „Instances”. to znaczy.
var config = ConfigurationManager.GetSection("registerCompanies") as MyConfigSection; foreach (MyConfigInstanceElement e in config.Instances) { Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); }
źródło