7

वंशज कस्टमसेटिंग तत्व में अभिभावक कॉन्फ़िगरेशन में एक विशेषता सेट कैसे प्राप्त और उपयोग कर सकते हैं? जब कस्टमसेटिंग तत्व वैल्यू प्रॉपर्टी वापस कर रहा है तो मुझे इस विशेषता की आवश्यकता है।मैं वंशज तत्वों पर .NET कस्टम कॉन्फ़िगरेशन एलिमेंट गुणों का उपयोग कैसे करूं?

मैं इस तरह App.config स्वरूपित करना चाहते हैं:

<CustomSettings someProperty="foo"> 
    <CustomSetting key="bar" value="fermeneba" /> 
    <CustomSetting key="laa" value="jubaduba" /> 
</CustomSettings> 

मैं कोड, काम, सिवाय इसके कि मैं CustomSetting वर्ग से someProperty विशेषता पहुंचने का एक तरीका नहीं खोज पाए।

<CustomSettings> 
    <CustomSetting someProperty="foo" key="bar" value="fermeneba" /> 
    <CustomSetting someProperty="foo" key="laa" value="jubaduba" /> 
</CustomSettings> 

उत्तर

12

हासिल करने के लिए इस और अधिक कठिन की तुलना में यह होना चाहिए, क्योंकि System.Configuration एपीआई अनुमति नहीं देता है: एक ही रास्ता है कि मैं मिल गया है, अब तक, इस तरह विन्यास, जो गन्दा है फ़ॉर्मेट करने के लिए है आप अपने माता-पिता को ConfigurationElement से नेविगेट करने के लिए। इसलिए, यदि आप कुछ जानकारी तक पहुंचना चाहते हैं जो मूल तत्व पर आपको उस संबंध को मैन्युअल रूप से बनाने की आवश्यकता है।

public class CustomSettingsSection : ConfigurationSection 
{ 
    [ConfigurationProperty("someProperty", DefaultValue="")] 
    public string SomeProperty 
    { 
     get { return (string)base["someProperty"]; } 
     set { base["someProperty"] = value; } 
    } 

    [ConfigurationProperty("", IsDefaultCollection = true)] 
    public CustomSettingElementCollection Elements 
    { 
     get 
     { 
      var elements = base[""] as CustomSettingElementCollection; 
      if (elements != null && elements.Section == null) 
       elements.Section = this; 
      return elements; 
     } 
    } 
} 

public class CustomSettingElementCollection : ConfigurationElementCollection 
{ 

    internal CustomSettingsSection Section { get; set; } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get { return ConfigurationElementCollectionType.BasicMap; } 
    } 

    public CustomSettingElement this[string key] 
    { 
     get { return BaseGet(key) as CustomSettingElement; } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new CustomSettingElement { Parent = this }; 
    } 

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

    protected override string ElementName 
    { 
     get { return "customSetting"; } 
    } 
} 

public class CustomSettingElement : ConfigurationElement 
{ 

    internal CustomSettingElementCollection Parent { get; set; } 

    public string SomeProperty 
    { 
     get 
     { 
      if (Parent != null && Parent.Section != null) 
       return Parent.Section.SomeProperty; 
      return default(string); 
     } 
    } 




    [ConfigurationProperty("key", IsKey = true, IsRequired = true)] 
    public string Key 
    { 
     get { return (string)base["key"]; } 
     set { base["key"] = value; } 
    } 

    [ConfigurationProperty("value", DefaultValue = "")] 
    public string Value 
    { 
     get { return (string)base["value"]; } 
     set { base["value"] = value; } 
    } 

} 

आप देख सकते हैं कि CustomSettingElementCollection एक Section संपत्ति जो खंड के Elements गेटर में सेट हो जाता है: मैं एक साथ एक नमूना कार्यान्वयन करता है कि आपके सवाल में config टुकड़ा के लिए रख दिया है। बदले में CustomSettingElement में Parent संपत्ति है जो संग्रह की CreateNewElement() विधि में सेट हो जाती है।

तब यह संबंध पेड़ को चलाना और SomeProperty तत्व को तत्व में जोड़ने के लिए संभव बनाता है, भले ही यह उस तत्व पर वास्तविक कॉन्फ़िगरेशनप्रॉपर्टी के अनुरूप न हो।

आशा है कि आपको यह पता चल जाएगा कि आपकी समस्या का समाधान कैसे करें!

+0

यह पूरी तरह से काम किया! धन्यवाद! –