"जोड़ें" तत्वों की एक सरल सूची के साथ कस्टम app.config अनुभाग


88

मैं एक कस्टम ऐप कैसे बना सकता हूं ।config सेक्शन जो addतत्वों की एक सरल सूची है ?

मुझे कुछ उदाहरण मिले हैं (जैसे कि app.config में कस्टम कॉन्फिग सेक्शन कैसे बनाएं? ) इस तरह दिखने वाले कस्टम सेक्शन के लिए।

<RegisterCompanies>
  <Companies>
    <Company name="Tata Motors" code="Tata"/>
    <Company name="Honda Motors" code="Honda"/>
  </Companies>
</RegisterCompanies>

लेकिन मैं अतिरिक्त संग्रह तत्व ("कंपनियों") से कैसे बचूं ताकि यह समान appSettingsऔर connectionStringsवर्गों के समान दिखे? दूसरे शब्दों में, मैं चाहूंगा:

<registerCompanies>
  <add name="Tata Motors" code="Tata"/>
  <add name="Honda Motors" code="Honda"/>
</registerCompanies>

जवाबों:


115

OP config फ़ाइल के आधार पर कोड के साथ पूर्ण उदाहरण:

<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>

यहां संक्षिप्त संग्रह के साथ एक कस्टम कॉन्फ़िगरेशन अनुभाग को लागू करने के लिए नमूना कोड है

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); 
}

@Jay वाकर आप जिस वस्तु की आवश्यकता है, उस तक पहुँचने के बारे में क्या करते हैं, जैसे: - config.Instances ["Tata Motors"] क्या ऐसा करना संभव है?
साइमन

2
यह काम करने के लिए टैग के <configSection>बाद सही होना चाहिए इंगित करना चाहिए <configuration>!
वेदरन कोपंजा

2
यह भी इंगित करना चाहिए कि <ऐड की आवश्यकता है। आपको अपना कस्टम बनाने <<टैग इस काम के साथ काम नहीं करता है
स्टीव एक डी

8
AFAIK - यह कोड "config [" Tata Motors "]" b / c को संकलित नहीं करेगा। आपको अपने दम पर संग्रह में आइटमों की गणना करने का एक तरीका खोजना होगा।
सेड्रिक

1
@JayWalker को सब अच्छा लगा। अनुभाग के लिए आपके उदाहरण में "My.MyConfiguration, My.Assembly" ने मुझे फेंक दिया। मुझे सिर्फ "MyAssembly.MyConfiguration, MyAssembly" का उपयोग करना था जो मैं प्रयास कर रहा था।
ग्लेन

38

कोई कस्टम कॉन्फ़िगरेशन अनुभाग आवश्यक नहीं है।

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>

पुन: प्राप्त करें

// 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]);
}

1
मुझे लगता है कि यह ओपी के सवाल का सख्ती से जवाब नहीं देता है, लेकिन मुझे लगता है कि यह एक वैध समाधान है, और बहुत सरल है। बहुत कम से कम इसने मेरी मदद की!
स्टाइल

2
@ styl0r आप सही कह रहे हैं। इसका कड़ाई से जवाब नहीं है। यदि आपको मेरी समाधान कुंजी / मान के बजाय गुण नाम / कोड का उपयोग करना है, तो आपको वास्तव में कस्टम अनुभाग का उपयोग करना होगा। हालाँकि, मुझे लगता है कि आप कॉन्फ़िग फ़ाइल के नियंत्रण में हैं, और कस्टम क्लास बनाने की तुलना में बेहतर चीजें हैं।
JJS

4
बहुत सरल और साफ! किसी भी अतिरिक्त कस्टम अनुभाग / तत्व ब्लोटवेयर की आवश्यकता नहीं है।
ओन्ड

2
यदि आप केवल संस्करण संख्या बदलकर चाहें तो आप संस्करण = 4.0.0.0 पर भी अपडेट कर सकते हैं। यदि आपको केवल अतिरिक्त सरल सूचियों की आवश्यकता है तो यह सबसे अच्छा उत्तर है। वही "System.Configuration.ConnectionStringsSection" के लिए भी किया जा सकता है, हालांकि डुप्लिकेट को ऐप सेटिंग्स की तुलना में थोड़ा अलग तरीके से संभाला जाता है।
शार्पिरो

@Sharpiro आप विधानसभा संस्करण के साथ मुद्दे थे? मुझे लगा कि असेंबली बाइंडिंग गति के नए संस्करणों के लिए भी, गति में रही होगी।
JJS

22

ऊपर जे वॉकर के जवाब के आधार पर , यह एक पूर्ण कार्य उदाहरण है जो अनुक्रमण करने की क्षमता जोड़ता है:

<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>

यहां संक्षिप्त संग्रह के साथ एक कस्टम कॉन्फ़िगरेशन अनुभाग को लागू करने के लिए नमूना कोड है

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; }
      }
   }
}

यहां कोड से कॉन्फ़िगरेशन जानकारी तक पहुंचने का एक उदाहरण दिया गया है।

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);
}

2
यह भी खूब रही। अब हमें सिर्फ एक इंस्टेंस को अपडेट करने, जोड़ने और हटाने के लिए उदाहरण कोड की आवश्यकता है।
स्कॉट हचिंसन

1
आपके समाधान के लिए धन्यवाद! जिसने भी एमएस में यह बनाया है ... यह वास्तव में अनावश्यक रूप से जटिल है।
स्विच 386

8

जे वॉकर के जवाब के आधार पर, तत्वों को एक्सेस करने के लिए "इंस्टेंस" संग्रह के माध्यम से पुनरावृति करने की आवश्यकता है। अर्थात।

var config = ConfigurationManager.GetSection("registerCompanies") 
                 as MyConfigSection;

foreach (MyConfigInstanceElement e in config.Instances) { 
   Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.