如何检查appSettings密钥是否存在?


146

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

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

Answers:


223

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
}

2
我们的库中有一个类似SQL的IsNull函数,这使得检索设置非常方便:Dim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
Eirik H

10
它引发“对象引用未设置为对象实例”
Waqar Alamgir13年

不,这是错误的。如果应用设置xml节点中不存在“ myKey”,则该代码将引发异常。
Gionata

如果您检查IsNullOrEmpty,则当您实际有一个带有空白字符串值的键作为有效设置时,将运行“键不存在”的逻辑
nrjohnstone

3
不是最好的答案,因为这会引发异常。Divyesh Patel是更好的解决方案。
VRPF

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

如果您以后不希望使用该值,则效率可能会稍微更高(?)。这个问题专门提到测试“如果应用程序设置可用”。由于“可用性”暗示了一种在我的脑海中使用它的愿望,因此我想说user195488提供的答案对于来这里的人们会更加有用-但严格来说,您的答案也是正确的。
赛马会

10
对于这样一个简单的事实,这是一个更好的解决方案:它实际上正在检查密钥是否存在。如果我的密钥有空白值,则user195488提供的解决方案将给我带来误报。
dyslexicanaboko

6
此解决方案不正确。AppSettings是一个NameValueCollection,默认情况下,在进行键查找时不区分大小写。但是,您在此处使用的LINQ .Contains扩展方法默认为区分大小写的比较。
Jax 2015年

9

通过泛型和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);

ConfigurationManager.AppSettings不区分大小写,Any(key => key == MyKey但是
janv8000 '18

@ janv8000我想要区分大小写,但更新了示例以进行处理。
codebender

正确的不区分大小写的比较使用ToUpper更快(请参见stackoverflow.com/a/12137/389424)。甚至更好的方法是使用String.Equals()重载传递一个StringComparisonType。
janv8000 '18

这是一个非常好的解决方案。我对实现进行了一些修改,以支持所需设置的概念。只是一件事-请记住在using System.ComponentModel;您的类中添加语句以支持该类的使用TypeDescriptor
STLDev


2

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

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

或者,如代码猴子建议的那样:

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

2

如果您知道密钥类型,请尝试使用上部选项来灵活处理所有方式 bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);


2

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

   const string MyKey = "myKey"

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

当然...但是idunno- 这种方法有什么好处吗?如果我真的很精通Linq(大多数C#程序员最终可能会精通),那么阅读此示例可能会很容易,但是我认为它不会更容易 -因此除非有效率优势...为什么?
赛马会2014年

没有效率优势,语法上冗长的imo。
约翰·尼古拉斯

1
ConfigurationManager.AppSettings不区分大小写,Any(key => key == MyKey但是
janv8000 '18

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;
}

0

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

  // TimeOut
  if (int.TryParse(ConfigurationManager.AppSettings["timeOut"], out int timeOut))
  {
     this.timeOut = timeOut;
  }

欢迎来到SO!发布答案时,请尝试说明您的解决方案。在这种情况下,还有更多答案,请尝试向您展示专业人士。
DavidGarcíaBodego,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.