2010-07-20 625 views
104

¿Cómo verifico si hay una configuración de aplicación disponible?¿Cómo verificar si existe una clave appSettings?

es decir app.config

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

y en el CodeFile

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

Respuesta

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

Tenemos una [función IsNull tipo SQL] (https://gist.github.com/eithe/5589891) en nuestra biblioteca que hace que la recuperación de un entorno muy útil: 'Dim configValue As String = Util.IsNull (ConfigurationManager.AppSettings.Get (" SettingName "), String.Empty)' –

+7

Lanza "Referencia de objeto no establecida a una instancia de un objeto" –

+0

No, está mal. Si "myKey" no existe en el nodo xml de la configuración de la aplicación, el código arroja una excepción. – Gionata

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

Esto probablemente sería un poco más eficiente (?) Si no desea utilizar el valor posteriormente. La pregunta menciona específicamente la prueba 'si hay una configuración de aplicación disponible'. Dado que la disponibilidad implica el deseo de utilizarla en mi mente, diría que la respuesta proporcionada por el usuario195488 será más útil para las personas que vienen aquí, pero en términos estrictos, su respuesta también es correcta. –

+5

Esta es una solución mucho mejor por el simple hecho de que realmente está comprobando si existe la clave. Si tengo un valor en blanco para mi clave, la solución proporcionada por user195488 me daría un falso positivo. – dyslexicanaboko

+2

Esta solución es incorrecta. AppSettings es una NameValueCollection que de forma predeterminada es ** case-insensitive ** cuando se trata de búsquedas de claves. El método de extensión LINQ .Contains que está utilizando aquí, sin embargo, tendrá de forma predeterminada una comparación ** sensible a mayúsculas y minúsculas **. – Jax

2

Si la clave que está buscando no está presente en el archivo de configuración, no podrá convertirla en una cadena con .ToString() porque el valor será nulo y obtendrá un El error "Referencia de objeto no configurado a una instancia de un objeto". Lo mejor es primero ver si el valor existe antes de tratar de obtener la representación de cadena.

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

O, como Code Monkey sugirió:

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

opciones superior da, flexible para todo tipo, no sé si el tipo de clave intentar analizar los bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

3

Creo que la expresión LINQ puede ser mejor:

const string MyKey = "myKey" 

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

seguro ... pero idunno - ¿hay alguna ventaja en este método? Si estoy REALMENTE bien versado en Linq (que la mayoría de los programadores de C# probablemente lo serán), entonces sería fácil leer este ejemplo, pero no creo que sea más fácil, así que a menos que haya una ventaja de eficiencia ... ¿por qué? –

+0

sin ventaja de eficiencia y sintácticamente detallado. –

2

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

3

Valor predeterminado devuelto con seguridad a través de genéricos y 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; 
} 

Se utiliza de la siguiente manera:

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