2010-07-20 12 views
104

Jak sprawdzić, czy ustawienie aplikacji jest dostępne?Jak sprawdzić, czy istnieje klucz aplikacji?

tj app.config

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

oraz w codefile

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

Odpowiedz

160

MSDN: Configuration Manager.AppSettings

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

lub

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

Mamy [funkcja IsNull SQL-like] (https://gist.github.com/eithe/5589891) w naszej bibliotece, która sprawia, że ​​pobieranie ustawienie bardzo przydatny: 'Dim configValue As String = Util.IsNull (ConfigurationManager.AppSettings.Get (" SettingName "), String.Empty)' –

+7

Zgłasza "Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu" –

+0

Nie, to jest złe. Jeśli "myKey" nie istnieje w węźle ustawień aplikacji xml, kod wygenerował wyjątek. – Gionata

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

Prawdopodobnie byłoby to nieco bardziej wydajne (?), Gdybyś nie chciał później użyć tej wartości. Pytanie wyraźnie wspomina o testowaniu "jeśli ustawienie aplikacji jest dostępne". Ponieważ Dostępność oznacza chęć użycia go w moim umyśle, powiedziałbym, że odpowiedź dostarczona przez użytkownika195488 będzie bardziej przydatna dla osób przyjeżdżających tutaj - ale ściśle rzecz biorąc, twoja odpowiedź jest również poprawna. –

+5

To o wiele lepsze rozwiązanie z prostego faktu, że faktycznie sprawdza, czy klucz istnieje. Jeśli mam pustą wartość dla mojego klucza, rozwiązanie dostarczone przez user195488 dałoby mi fałszywy alarm. – dyslexicanaboko

+2

To rozwiązanie jest niepoprawne. AppSettings to NameValueCollection, która domyślnie ** uwzględnia wielkość liter ** w przypadku wyszukiwania kluczy. Używana tutaj metoda rozszerzenia LINQ .Contains będzie jednak domyślnie uwzględniać ** wielkość liter **. – Jax

2

Jeśli szukany klucz nie występuje w pliku konfiguracyjnym, nie będzie można przekonwertować go na ciąg znaków z .ToString(), ponieważ wartość będzie null, a otrzymasz Błąd "Brak odniesienia do obiektu instancji obiektu". Najlepiej najpierw sprawdzić, czy wartość istnieje przed próbą uzyskania reprezentacji napisów.

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

Albo, jak Code Monkey zasugerował:

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

Górne opcje daje elastyczne wszelkiego rodzaju, jeśli znasz typ klucza spróbować parsowania im bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

3

myślę wyrażenie LINQ może być najlepiej:

const string MyKey = "myKey" 

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

na pewno ... ale idunno - czy jest jakaś wada_ dla tej metody? Jeśli jestem NAPRAWDĘ dobrze zorientowany w Linq (który najprawdopodobniej będzie prawdopodobnie programistą C#), to prawdopodobnie będzie on łatwy do przeczytania tego przykładu, ale nie sądzę, że byłby on jeszcze łatwiejszy - więc jeśli nie ma przewagi wydajności ... czemu? –

+0

brak przewagi wydajności i składniowo pełne imo. –

2

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

3

Bezpiecznie zwrócona wartość domyślna za pośrednictwem generycznych i LINQ.

public T ReadAppSetting<T>(string searchKey, T defaultValue) 
{ 
    if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == searchKey)) 
    { 
     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 default 
    } 
    return defaultValue; 
} 

wykorzystane w następujący sposób:

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