Как проверить, существует ли ключ appSettings? - PullRequest
133 голосов
/ 21 июля 2010

Как проверить, доступна ли настройка приложения?

т.е. 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
}

Ответы [ 8 ]

202 голосов
/ 21 июля 2010

MSDN: Configuration Manager.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
}
70 голосов
/ 20 мая 2011
if (ConfigurationManager.AppSettings.AllKeys.Contains("myKey"))
{
    // Key exists
}
else
{
    // Key doesn't exist
}
8 голосов
/ 25 марта 2017

Безопасно вернул значение по умолчанию через дженерики и 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);
2 голосов
/ 04 августа 2015

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

2 голосов
/ 28 февраля 2014

Я думаю, что выражение LINQ может быть лучшим:

   const string MyKey = "myKey"

   if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == MyKey))
          {
              // Key exists
          }
2 голосов
/ 13 марта 2012

Верхние параметры дают гибкость для всех способов, если вы знаете тип ключа, попробуйте их проанализировать bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

2 голосов
/ 20 сентября 2011

Если искомый ключ отсутствует в файле конфигурации, вы не сможете преобразовать его в строку с помощью .ToString (), поскольку значение будет нулевым, и вы получите объект "Object"ссылка не установлена ​​на экземпляр объекта "ошибка.Лучше сначала проверить, существует ли значение, прежде чем пытаться получить строковое представление.

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

Или, как предложил Code Monkey:

if (ConfigurationSettings.AppSettings["myKey"] != null)
{
// Now do your magic..
}
1 голос
/ 25 мая 2019

Мне понравился ответ кодировщика , но он нужен для работы в 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;
}
...