c# - कस्टम विन्यास, कॉन्फ़िगरेशन एलीमेंट्स, और कॉन्फ़िगरेशनप्रॉपर्टीज




app-config configurationsection (4)

2 चीजें जिनसे मैं अपने सिर के ऊपर से सोच सकता हूँ, डिफ़ॉल्ट वेल्यू का उपयोग करना होगा, जैसे:

    [ConfigurationProperty("customsettingitem", DefaultValue = -1)]
    public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }

यह मानते हुए कि कुछ मान अमान्य है इस स्थिति में, CustomSettingItem == -1 का अर्थ है यह सेट नहीं था, और> = 0 कॉन्फ़िग में एक वैल्यू सेट था। बेशक -1 मानता है कि पहली जगह में मान्य इनपुट नहीं था।

दूसरे विचार का उपयोग नलएबल इंक का उपयोग करना है:

    [ConfigurationProperty("customsettingitem", IsRequired = false)]
    public int? CustomSettingItem { get { return (int?)this["customsettingitem"]; } }

अब यदि कोई भी कॉन्फ़िग में सेट नहीं किया गया है, तो उसे 0 की बजाय रिक्त स्थान पर जाना चाहिए।

मैं पिछले 3 दिनों के लिए नेट पर दस्त डाल रहा हूं, और इस प्रश्न का कोई भी संदर्भ नहीं मिल सकता है। मैंने अपने app.config के साथ प्रयोग करने के लिए एक कस्टम कॉन्फ़िगरेशन क्लास बनाया है सब कुछ ठीक काम करता है समस्या तब होती है जब कोई कॉन्फ़िगरेशन गुण (कॉन्फ़िगरेशन तत्व की) आवश्यक नहीं है, और app.config में परिभाषित नहीं है ऐसा लगता है कि कॉन्फ़िगरेशन संपत्ति के लिए डिफ़ॉल्ट मान लौट आए हैं क्या किसी को पता है कि यह पता कैसे निर्धारित करें कि संपत्ति app.config में परिभाषित नहीं है? (मैं अपने app.config पोस्ट करने के लिए कोशिश कर रहा हूँ, लेकिन यह कैसे पता नहीं कर सकते ... किसी को कैसे पता है?)


//Main
namespace TestStub
{
    class Program
    {
        static void Main(string[] args)
        {
            CustomSettingsHandler config = (CustomSettingsHandler)ConfigurationManager.GetSection("CustomSettingsManager");
            Console.WriteLine("Setting1 {0}", config.Setting1.CustomSettingItem);
            Console.WriteLine("Setting2 {0}", config.Setting2.CustomSettingItem);
        }
    }
}

//Custom Configuration Class
namespace CustomConfiguration
{
    public class CustomSettingsHandler : ConfigurationSection
    {
        [ConfigurationProperty("setting1", IsRequired = false)]
        public CustomSettingElement Setting1 { get { return (CustomSettingElement)this["setting1"]; } }

        [ConfigurationProperty("setting2", IsRequired = false)]
        public CustomSettingElement Setting2 { get { return (CustomSettingElement)this["setting2"]; } }
    }

    public class CustomSettingElement : ConfigurationElement
    {
        [ConfigurationProperty("customsettingitem", IsRequired = false)]
        public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }
    }
}

अभी तक मैं एक संपत्ति को बताने के लिए सक्षम नहीं किया गया है अगर यह विन्यास फाइल में परिभाषित नहीं है। ऐसा लगता है कि इसमें असीम ज्ञान है, माइक्रोसॉफ्ट ने फैसला किया है कि वास्तव में आपको स्ट्रिंग चाहिए। खाली या नया कॉन्फ़िगरेशन एलेमेंट () जब आप रिक्त टाइप करते हैं

जिस तरह से मैं वर्तमान में इसे हल कर रहा हूं वह इस तरह से है:

    bool _hasProp = true;
    protected override object OnRequiredPropertyNotFound(string name)
    {
        if (name == "prop")
        {
            _hasProp = false;
            return null; // note that this will still not make prop null
        }
        return base.OnRequiredPropertyNotFound(name);
    }

    [ConfigurationProperty("prop", IsRequired = true)]
    public string Prop
    {
        get { return _hasProp ? (string) this["prop"] : null; }
    }

यह एक हैक है और गलत तरीके से संपत्ति को चिह्नित करेगा। यदि आप अपनी कॉन्फ़िगरेशन फ़ाइल को संपादित करने के लिए एक उपकरण का उपयोग कर रहे हैं तो यह इसे पसंद नहीं करेगा


निम्न प्रयास करें:

configElement.ElementInformation.Properties[propName].ValueOrigin = 
        PropertyValueOrigin.SetHere

ValueOrigin संपत्ति बताती है कि मूल्य कहां से आता है


आप निम्न का उपयोग करके भी जांच कर सकते हैं:

config.Setting1.CustomSettingItem.ElementInformation.IsPresent 

यह आपको झूठी देगी अगर यह आपकी कॉन्फ़िग फाइल में नहीं मिला है।





configurationelement