Bagaimana cara membuat bagian app.config kustom yang hanya berupa daftar add
elemen sederhana ?
Saya telah menemukan beberapa contoh (misalnya, Bagaimana cara membuat bagian konfigurasi khusus di app.config? ) Untuk bagian khusus yang terlihat seperti ini:
<RegisterCompanies>
<Companies>
<Company name="Tata Motors" code="Tata"/>
<Company name="Honda Motors" code="Honda"/>
</Companies>
</RegisterCompanies>
Tetapi bagaimana cara menghindari elemen koleksi tambahan ("Perusahaan") sehingga terlihat sama dengan bagian appSettings
dan connectionStrings
? Dengan kata lain, saya suka:
<registerCompanies>
<add name="Tata Motors" code="Tata"/>
<add name="Honda Motors" code="Honda"/>
</registerCompanies>
c#
app-config
Joe Daley
sumber
sumber
Jawaban:
Contoh lengkap dengan kode berdasarkan file konfigurasi 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>
Berikut adalah kode contoh untuk menerapkan bagian konfigurasi khusus dengan koleksi yang diciutkan
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; } } } }
Berikut adalah contoh cara mengakses informasi konfigurasi dari kode.
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); }
sumber
<configSection>
harus tepat setelah<configuration>
agar berfungsi!Tidak ada bagian konfigurasi khusus yang diperlukan.
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>
Ambil
// 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]); }
sumber
Berdasarkan jawaban Jay Walker di atas, berikut adalah contoh kerja lengkap yang menambahkan kemampuan untuk melakukan pengindeksan:
<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>
Berikut adalah kode contoh untuk menerapkan bagian konfigurasi khusus dengan koleksi yang diciutkan
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; } } } }
Berikut adalah contoh cara mengakses informasi konfigurasi dari kode.
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); }
sumber
Berdasarkan jawaban Jay Walker, mengakses elemen perlu dilakukan dengan melakukan iterasi melalui koleksi "Instances". yaitu.
var config = ConfigurationManager.GetSection("registerCompanies") as MyConfigSection; foreach (MyConfigInstanceElement e in config.Instances) { Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); }
sumber