अगर ऐपसेटिंग कुंजी मौजूद है तो कैसे जांचें?


146

यदि मैं एप्लिकेशन सेटिंग उपलब्ध है, तो मैं कैसे देखूं?

यानी app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key ="someKey" value="someValue"/>
  </appSettings>
</configuration>

और कोडफाइल में

if (ConfigurationManager.AppSettings.ContainsKey("someKey"))
{
  // Do Something
}else{
  // Do Something Else
}

जवाबों:


223

MSDN: कॉन्फ़िगरेशन मैनेजर ।AppSettings

if (ConfigurationManager.AppSettings[name] != null)
{
// Now do your magic..
}

या

string s = ConfigurationManager.AppSettings["myKey"];
if (!String.IsNullOrEmpty(s))
{
    // Key exists
}
else
{
    // Key doesn't exist
}

2
हम एक है SQL जैसी IsNull समारोह : हमारे पुस्तकालय जो एक सेटिंग बहुत आसान पुन: प्राप्त करने देता है मेंDim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
ईरिक एच

10
यह "वस्तु संदर्भ वस्तु के उदाहरण के लिए निर्धारित नहीं है" फेंकता है
वकार आलमगीर

नहीं, यह गलत है। यदि "myKey" ऐप सेटिंग xml नोड में मौजूद नहीं है, तो कोड एक अपवाद फेंक दिया है।
Gionata

यदि आप IsNullOrEmpty की जांच करते हैं, तो "कुंजी मौजूद नहीं है" के लिए आपका तर्क तब चलेगा जब आपके पास एक वैध सेटिंग के रूप में रिक्त स्ट्रिंग मान के साथ एक कुंजी होगी
nrjohnstone

3
सबसे अच्छा जवाब नहीं है क्योंकि यह अपवाद फेंकता है। दिव्येश पटेल एक बेहतर समाधान है।
वीआरपीएफ

81
if (ConfigurationManager.AppSettings.AllKeys.Contains("myKey"))
{
    // Key exists
}
else
{
    // Key doesn't exist
}

यह शायद थोड़ा और अधिक कुशल (?) होगा यदि आपके पास मूल्य का उपयोग करने की कोई इच्छा नहीं है। प्रश्न में विशेष रूप से परीक्षण का उल्लेख है 'यदि कोई एप्लिकेशन सेटिंग उपलब्ध है'। चूंकि उपलब्धता का मेरे मन में उपयोग करने की इच्छा है, इसलिए मैं कहूंगा कि user195488 द्वारा प्रदान किया गया उत्तर यहां आने वाले लोगों के लिए अधिक उपयोगी होगा - लेकिन कड़ाई से बोलते हुए, आपका उत्तर भी सही है।
कोड जॉकी

10
यह सरल तथ्य के लिए एक बेहतर समाधान है कि यह वास्तव में जाँच कर रहा है कि क्या कुंजी मौजूद है। यदि मेरी कुंजी के लिए मेरे पास रिक्त मान है, तो user195488 द्वारा प्रदान किया गया समाधान मुझे एक गलत सकारात्मक देगा।
डिस्लेक्सिकनकोको

6
यह समाधान गलत है। AppSettings एक NameValueCollection है, जो डिफ़ॉल्ट रूप से केस-असंवेदनशील होता है जब यह महत्वपूर्ण लुकअप के लिए आता है। LINQ .Contains एक्सटेंशन विधि जो आप यहाँ उपयोग कर रहे हैं, हालाँकि केस-संवेदी तुलना के लिए डिफ़ॉल्ट होगी ।
Jax

9

जेनेरिक और LINQ के माध्यम से सुरक्षित रूप से डिफ़ॉल्ट मान लौटाया।

public T ReadAppSetting<T>(string searchKey, T defaultValue, StringComparison compare = StringComparison.Ordinal)
{
    if (ConfigurationManager.AppSettings.AllKeys.Any(key => string.Compare(key, searchKey, compare) == 0)) {
        try
        { // see if it can be converted.
            var converter = TypeDescriptor.GetConverter(typeof(T));
            if (converter != null) defaultValue = (T)converter.ConvertFromString(ConfigurationManager.AppSettings.GetValues(searchKey).First());
        }
        catch { } // nothing to do just return the defaultValue
    }
    return defaultValue;
}

निम्नानुसार उपयोग किया जाता है:

string LogFileName = ReadAppSetting("LogFile","LogFile");
double DefaultWidth = ReadAppSetting("Width",1280.0);
double DefaultHeight = ReadAppSetting("Height",1024.0);
Color DefaultColor = ReadAppSetting("Color",Colors.Black);

ConfigurationManager.AppSettingsकेस-संवेदी नहीं है, Any(key => key == MyKeyलेकिन यह है
जानव .०००

@ janv8000 मैं केस संवेदनशीलता चाहता था, लेकिन इसे संभालने के लिए उदाहरण को अपडेट किया।
कोडबेंडर

ToUpper के साथ उचित केस-असंवेदनशील तुलना तेजी से होती है (देखें stackoverflow.com/a/12137/389424 )। यहां तक ​​कि beter को स्ट्रिंग का उपयोग करना है। Equals () एक StringComparisonType से गुजरने वाले अधिभार।
jnv8000 6

यह वास्तव में इस मुद्दे का एक महान समाधान है। मैंने आवश्यक सेटिंग्स की अवधारणा का समर्थन करने के लिए कार्यान्वयन को थोड़ा संशोधित किया है। बस एक चीज - using System.ComponentModel;कक्षा के उपयोग का समर्थन करने के लिए अपनी कक्षा में कथन जोड़ना याद रखें TypeDescriptor
STLDev


2

यदि आप जिस कुंजी की तलाश कर रहे हैं वह कॉन्फिगर फ़ाइल में मौजूद नहीं है, तो आप इसे .ToString () के साथ स्ट्रिंग में परिवर्तित नहीं कर पाएंगे क्योंकि मान शून्य होगा और आपको "ऑब्जेक्ट संदर्भ सेट नहीं" होगा। एक वस्तु "त्रुटि" की आवृत्ति के लिए। स्ट्रिंग प्रतिनिधित्व प्राप्त करने का प्रयास करने से पहले यह देखना सबसे अच्छा है कि क्या मूल्य मौजूद है।

if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["myKey"]))
{
    String myKey = ConfigurationManager.AppSettings["myKey"].ToString();
}

या, जैसा कि कोड बंदर ने सुझाव दिया है:

if (ConfigurationSettings.AppSettings["myKey"] != null)
{
// Now do your magic..
}

2

ऊपरी विकल्प सभी तरह से लचीले होते हैं, यदि आप जानते हैं कि कुंजी प्रकार उन्हें पार्स करने का प्रयास करें bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);


2

मुझे लगता है कि LINQ अभिव्यक्ति सबसे अच्छी हो सकती है:

   const string MyKey = "myKey"

   if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == MyKey))
          {
              // Key exists
          }

ज़रूर ... लेकिन idunno - क्या इस विधि का कोई फायदा है? अगर मैं वास्तव में लाइनक में अच्छी तरह से वाकिफ हूं (जो कि ज्यादातर C # प्रोग्रामर शायद आखिरकार होंगे), तो शायद इस उदाहरण को पढ़ना उतना ही आसान होगा , लेकिन मुझे नहीं लगता कि यह कभी भी आसान होगा - इसलिए जब तक कि कोई दक्षता लाभ न हो ... क्यों?
कोड जॉकी

कोई दक्षता लाभ और वाक्यविन्यास क्रिया imo।
जॉन निकोलस

1
ConfigurationManager.AppSettingsकेस-संवेदी नहीं है, Any(key => key == MyKeyलेकिन यह
janv8000

1

मुझे कोडबेंडर का उत्तर पसंद आया , लेकिन इसे C ++ / CLI में काम करने की आवश्यकता थी। यह वही है जिसके साथ मैं समाप्त हुआ। कोई LINQ उपयोग नहीं है, लेकिन काम करता है।

generic <typename T> T MyClass::ReadAppSetting(String^ searchKey, T defaultValue) {
  for each (String^ setting in ConfigurationManager::AppSettings->AllKeys) {
    if (setting->Equals(searchKey)) { //  if the key is in the app.config
      try {                           // see if it can be converted
        auto converter = TypeDescriptor::GetConverter((Type^)(T::typeid)); 
        if (converter != nullptr) { return (T)converter->ConvertFromString(ConfigurationManager::AppSettings[searchKey]); }
      } catch (Exception^ ex) {} // nothing to do
    }
  }
  return defaultValue;
}

0

TryParse के साथ नए c # सिंटैक्स का उपयोग करना मेरे लिए अच्छा रहा:

  // TimeOut
  if (int.TryParse(ConfigurationManager.AppSettings["timeOut"], out int timeOut))
  {
     this.timeOut = timeOut;
  }

एसओ में आपका स्वागत है! जब आप उत्तर पोस्ट करते हैं, तो कृपया अपने समाधान को थोड़ा समझाने की कोशिश करें। इस मामले में, कुछ और जवाब हैं, आप में पेशेवरों को उजागर करने का प्रयास करें।
डेविड गार्सिया बोडेगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.