Bir appSettings anahtarının olup olmadığı nasıl kontrol edilir?


148

Bir Uygulama Ayarının olup olmadığını nasıl kontrol ederim?

ie app.config

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

ve kod dosyasında

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

Yanıtlar:


223

MSDN: Configuration Manager.AppSettings

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

veya

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

2
Biz var IsNull SQL benzeri işlevi : çok kullanışlı bir ayarı alınırken yapar bizim kütüphanedeDim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
Eirik H

11
"Nesne başvurusu bir nesnenin bir örneğine ayarlanmadı"
mesajı

Hayır, yanlış. Uygulama ayarları xml düğümünde "myKey" yoksa, kod bir istisna attı.
Gionata

1
IsNullOrEmpty'yi kontrol ederseniz, "anahtar mevcut değil" mantığınız, geçerli bir ayar olarak boş bir dize değerine sahip bir anahtara sahip olduğunuzda çalışacaktır
nrjohnstone

3
en iyi cevap değil çünkü bu istisnalar doğuruyor. Divyesh Patel daha iyi bir çözüm.
VRPF

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

Daha sonra değeri kullanmak istemezseniz, bu muhtemelen biraz daha verimli (?) Olurdu. Soru özellikle 'bir Uygulama Ayarı mevcutsa' testinden bahsediyor. Kullanılabilirlik zihnimde onu kullanma arzusu anlamına geldiğinden, user195488 tarafından sağlanan cevabın buraya gelen insanlar için daha yararlı olacağını söyleyebilirim - ama kesinlikle konuşursak, cevabınız da doğru.
Kod Jokey

11
Bu, aslında anahtarın var olup olmadığını kontrol ettiği basit gerçeği için çok daha iyi bir çözümdür. Anahtarım için boş bir değere sahipsem, user195488 tarafından sağlanan çözüm bana yanlış bir pozitif verecektir.
dyslexicanaboko

7
Bu çözüm yanlıştır. AppSettings, anahtar aramalar söz konusu olduğunda varsayılan olarak büyük / küçük harfe duyarlı olmayan bir NameValueCollection'dır . Burada kullandığınız LINQ .Contains uzantı yöntemi, varsayılan olarak büyük / küçük harfe duyarlı bir karşılaştırmaya geçecektir .
Jax

9

Jenerikler ve LINQ aracılığıyla güvenli bir şekilde varsayılan değeri döndürdü.

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

Aşağıdaki gibi kullanılır:

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

ConfigurationManager.AppSettingsbüyük / küçük harfe duyarlı değildir, Any(key => key == MyKeyancak
janv8000

@ janv8000 Büyük / küçük harfe duyarlılık istedim, ancak örneği işlemek için güncelledim.
codebender

Uygun büyük / küçük harfe duyarlı olmayan karşılaştırmalar ToUpper ile daha hızlıdır (bkz. Stackoverflow.com/a/12137/389424 ). Daha da iyisi, bir StringComparisonType geçiren string.Equals () aşırı yüklemesini kullanmaktır.
janv8000

Bu, sorun için gerçekten harika bir çözüm. Gerekli ayarlar konseptini desteklemek için uygulamayı biraz değiştirdim. Sadece bir şey - using System.ComponentModel;sınıfın kullanımını desteklemek için sınıfınıza ifade eklemeyi unutmayın TypeDescriptor.
STLDev

3
var isAlaCarte = 
    ConfigurationManager.AppSettings.AllKeys.Contains("IsALaCarte") && 
    bool.Parse(ConfigurationManager.AppSettings.Get("IsALaCarte"));

2

Aradığınız anahtar yapılandırma dosyasında yoksa, .ToString () ile bir dizeye dönüştüremezsiniz çünkü değer boş olacak ve bir "Nesne başvurusu ayarlanmadı bir nesne "hatası örneğine. Dize gösterimini almaya çalışmadan önce değerin var olup olmadığını görmek en iyisidir.

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

Veya Code Monkey'in önerdiği gibi:

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

2

Üst seçenekler her şekilde esneklik sağlar, anahtar türünü biliyorsanız bunları ayrıştırmayı deneyin bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);


2

LINQ ifadesinin en iyisi olabileceğini düşünüyorum:

   const string MyKey = "myKey"

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

elbette ... ama idunno - bu yöntemin herhangi bir avantajı var mı? Eğer Linq konusunda GERÇEKTEN iyi bilgiliysem (ki çoğu C # programcısı muhtemelen sonunda olacaktır), o zaman bu örneği okumak muhtemelen o kadar kolay olurdu , ancak bunun daha kolay olacağını sanmıyorum - yani bir verimlilik avantajı yoksa ... neden?
Code Jockey

verimlilik avantajı yok ve sözdizimsel olarak ayrıntılı imo.
John Nicholas

1
ConfigurationManager.AppSettingsbüyük / küçük harfe duyarlı değildir, Any(key => key == MyKeyancak
janv8000

1

Kod bükücünün cevabını beğendim , ancak C ++ / CLI'de çalışması gerekiyordu. Bu benim son bulduğum şey. LINQ kullanımı yok, ancak çalışıyor.

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 ile yeni c # sözdizimini kullanmak benim için iyi çalıştı:

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

SO'ya hoş geldiniz! Cevabı gönderirken lütfen çözümünüzü biraz açıklamaya çalışın. Bu durumda, birkaç cevap daha var, Artıları sizinkini ortaya çıkarmaya çalışın.
David García Bodego
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.