2008-10-14 10 views
5

मैंने गतिशील रूप से SettingsProperty को .NET app.config फ़ाइल में जोड़ने का एक तरीका बनाया है। यह सब अच्छी तरह से काम करता है, लेकिन जब मैं अगली बार अपना ऐप लॉन्च कर रहा हूं तो मैं केवल डिजाइनर में बनाए गए गुण देख सकता हूं। मैं प्रॉपर्टी रनटाइम को वापस कैसे लोड कर सकता हूं?अगली बार गतिशील रूप से बनाई गई सेटिंग्सप्रॉपर्टी को वापस कैसे लोड करें?

SettingsProperty बनाने के लिए मेरे कोड ऐसा दिखाई देता है:

internal void CreateProperty<T>(string propertyName) 
{ 
    string providerName = "LocalFileSettingsProvider"; 
    System.Configuration.SettingsAttributeDictionary attributes = new SettingsAttributeDictionary(); 
    System.Configuration.UserScopedSettingAttribute attr = new UserScopedSettingAttribute(); 

    attributes.Add(attr.TypeId, attr); 

    System.Configuration.SettingsProperty prop; 
    SettingsProvider provider = ApplicationEnvironment.GlobalSettings.Providers[providerName]; 

    prop = new System.Configuration.SettingsProperty(
     propertyName, 
     typeof(T), 
     provider, 
     false, 
     default(T), 
     System.Configuration.SettingsSerializeAs.String, 
     attributes, 
     false, 
     false 
    ); 

    ApplicationEnvironment.GlobalSettings.Properties.Add(prop); 
    ApplicationEnvironment.GlobalSettings.Reload(); 
} 

जब अगले रन मैं सेटिंग्स संपत्ति के लिए पूछ रहा previosuly बनाई गई प्रॉपर्टी के किसी भी नहीं मिल सका। कोई फर्क नहीं पड़ता कि मैं ApplicationEnvironment.GlobalSettings.Reload(); पर कॉल करता हूं या नहीं।

उत्तर

1

उपयोगकर्ता परिभाषित कॉन्फ़िगरेशन सेटिंग्स उनके साथ बनाए गए असेंबली संस्करण से बंधे हैं। यदि आपके पास रोलिंग संस्करण संख्या है (उदाहरण के लिए 1.0। ), तो आप अंतिम रन से सेटिंग्स खो देंगे।

1

मैं एक ही मुद्दे पर आया था। आईएमएचओ समस्या यह है कि .NET System.Configuration.SettingsBase ऑब्जेक्ट उन गुणों के नाम, प्रकार इत्यादि को निर्धारित करने के लिए प्रतिबिंब का उपयोग करता है जिन्हें लगातार भंडारण से लोड किया जाना चाहिए। और जब आप गतिशील सेटिंग्स गुण जोड़ते हैं, तो यह जानकारी गुम होती है। तो आपको मूल्य को बचाने से पहले ही आपको पढ़ने से पहले सेटिंग प्रॉपर्टी परिभाषा को जोड़ना होगा। आपके मामले में, यह इस

... 
// the name and type of the property being read must be known at this point 
CreateProperty<T>(propertyName); 
ApplicationEnvironment.GlobalSettings.Reload(); 
T propertyValue = ApplicationEnvironment.GlobalSettings[propertyName]; 

आप सभी गुण आप उपयोग करना और उसके बाद सिर्फ एक बार Reload फोन चाहते हैं के लिए शुरुआत में CreateProperty विधि कॉल करने के लिए कर सकते हैं की तरह कुछ किया जाना चाहिए। दोनों मामलों में, आपको गुणों के नाम और प्रकारों को जानना होगा।