2010-07-20 17 views
104

Come verificare se è disponibile un'impostazione dell'applicazione?Come verificare se esiste una chiave appSettings?

cioè app.config

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

e nel codefile

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

risposta

160

MSDN: Configuration Manager.AppSettings

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

o

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

Abbiamo un [funzione IsNull SQL-like] (https://gist.github.com/eithe/5589891) nella nostra biblioteca, che rende il recupero di un ambiente molto utile: 'Dim configValue As String = Util.IsNull (ConfigurationManager.AppSettings.Get (" SettingName "), String.Empty)' –

+7

Getta "Riferimento oggetto non impostato su un'istanza di un oggetto" –

+0

No, è sbagliato. Se "myKey" non esiste nel nodo xml delle impostazioni dell'app, il codice genera un'eccezione. – Gionata

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

Questo probabilmente sarebbe leggermente più efficiente (?) Se non si desiderasse utilizzare il valore in seguito. La domanda menziona specificamente il test "se è disponibile un'impostazione dell'applicazione". Dal momento che la disponibilità implica il desiderio di usarlo nella mia mente, direi che la risposta fornita dall'utente195488 sarà più utile alle persone che verranno qui - ma, a rigor di termini, anche la tua risposta è corretta. –

+5

Questa è una soluzione molto migliore per il semplice fatto che in realtà controlla se la chiave esiste. Se ho un valore vuoto per la mia chiave, la soluzione fornita dall'utente195488 mi darebbe un falso positivo. – dyslexicanaboko

+2

Questa soluzione non è corretta. AppSettings è un NameValueCollection che per impostazione predefinita ** non fa distinzione tra maiuscole e minuscole ** quando si tratta di ricerche di chiavi. Il metodo di estensione LINQ .Contains che stai utilizzando qui, tuttavia, verrà impostato su un confronto ** con distinzione tra maiuscole e minuscole **. – Jax

2

Se la chiave che si sta cercando non è presente nel file di configurazione, non sarà in grado di convertirlo in una stringa con .ToString() in quanto il valore sarà nullo e si otterrà un Errore "Riferimento oggetto non impostato su un'istanza di un oggetto". È meglio prima vedere se il valore esiste prima di provare a ottenere la rappresentazione della stringa.

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

O, come Code Monkey suggerito:

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

opzioni superiore da flessibile a tutti i tipi, se si conosce il tipo di chiave provare l'analisi li bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

3

Credo che l'espressione LINQ può essere migliore:

const string MyKey = "myKey" 

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

sicuro ... ma idunno - c'è qualche _valore_ in questo metodo? Se sono DAVVERO esperto in Linq (che probabilmente alla fine sarà la maggior parte dei programmatori C#), allora probabilmente sarebbe facile leggere questo esempio, ma non credo che sarebbe mai più _questo_, quindi a meno che non ci sia un vantaggio in termini di efficienza ... perché? –

+0

nessun vantaggio di efficienza e sintatticamente verboso imo. –

2

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

3

Valore predefinito restituito in modo sicuro tramite generici e 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; 
} 

utilizzati come segue:

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