162

如何检查应用程序设置是否可用?

即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
}
4

9 回答 9

240

MSDN:配置管理器.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
}
于 2010-07-20T23:53:26.633 回答
91
if (ConfigurationManager.AppSettings.AllKeys.Contains("myKey"))
{
    // Key exists
}
else
{
    // Key doesn't exist
}
于 2011-05-20T11:14:24.827 回答
10

通过泛型和 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);
于 2017-03-25T04:22:46.037 回答
3
var isAlaCarte = 
    ConfigurationManager.AppSettings.AllKeys.Contains("IsALaCarte") && 
    bool.Parse(ConfigurationManager.AppSettings.Get("IsALaCarte"));
于 2015-08-04T15:12:18.633 回答
2

上选项为所有方式提供了灵活性,如果您知道键类型,请尝试解析它们 bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

于 2012-03-13T19:46:59.547 回答
2

我认为 LINQ 表达式可能是最好的:

   const string MyKey = "myKey"

   if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == MyKey))
          {
              // Key exists
          }
于 2014-02-28T16:56:13.190 回答
2

如果您要查找的键不在配置文件中,您将无法使用 .ToString() 将其转换为字符串,因为该值将为 null 并且您将获得“未设置对象引用到对象的实例”错误。在尝试获取字符串表示之前,最好先查看该值是否存在。

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

或者,正如 Code Monkey 所建议的:

if (ConfigurationSettings.AppSettings["myKey"] != null)
{
// Now do your magic..
}
于 2011-09-20T13:46:36.130 回答
1

我喜欢codebender 的答案,但需要它在 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;
}
于 2019-05-25T00:56:16.863 回答
0

在 TryParse 中使用新的 c# 语法对我来说效果很好:

  // TimeOut
  if (int.TryParse(ConfigurationManager.AppSettings["timeOut"], out int timeOut))
  {
     this.timeOut = timeOut;
  }
于 2019-10-31T01:50:37.453 回答