【问题标题】:How to check if an appSettings key exists?如何检查 appSettings 键是否存在?
【发布时间】:2011-03-18 17:46:42
【问题描述】:

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

即应用程序配置

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

【问题讨论】:

    标签: c# appsettings configurationmanager


    【解决方案1】:
    var isAlaCarte = 
        ConfigurationManager.AppSettings.AllKeys.Contains("IsALaCarte") && 
        bool.Parse(ConfigurationManager.AppSettings.Get("IsALaCarte"));
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 欢迎来到 SO!当您发布答案时,请尝试稍微解释您的解决方案。在这种情况下,还有几个答案,尝试暴露你的优点。
      【解决方案3】:

      我喜欢codebender's answer,但需要它在 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;
      }
      

      【讨论】:

        【解决方案4】:

        通过泛型和 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 =&gt; key == MyKey
        • @janv8000 我想要区分大小写,但更新了示例来处理它。
        • 使用 ToUpper 进行不区分大小写的正确比较会更快(请参阅 stackoverflow.com/a/12137/389424)。更好的是使用传递 StringComparisonType 的 string.Equals() 重载。
        • 这是一个非常好的解决方案。我稍微修改了实现以支持所需设置的概念。只有一件事 - 记得在你的类中添加 using System.ComponentModel; 语句以支持使用 TypeDescriptor 类。
        【解决方案5】:

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

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

        【讨论】:

        • 当然...但是不知道 - 这种方法有什么优势吗?如果我真的精通 Linq(大多数 C# 程序员最终可能会),那么阅读这个示例可能会很容易,但我认为它永远不会更容易 - 所以除非有效率优势......为什么?
        • 没有效率优势并且在语法上冗长 imo。
        • ConfigurationManager.AppSettings 不区分大小写,但Any(key =&gt; key == MyKey
        【解决方案6】:

        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
        }
        

        【讨论】:

        • 我们的库中有一个SQL-like IsNull function,这使得检索设置非常方便:Dim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
        • 它抛出“对象引用未设置为对象的实例”
        • 如果您检查 IsNullOrEmpty,那么当您实际上有一个具有空白字符串值的键作为有效设置时,您的“键不存在”逻辑将运行
        • 不是最佳答案,因为这会引发异常。 Divyesh Patel 是一个更好的解决方案。
        • 如果使用 .net 4.5 不抛出异常。如果我的设置存在但包含空值或空值,则返回误报。应该有一个HasKey() 或类似的方法。 Divyesh Patel 提供的答案更正确。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您要查找的键不存在于配置文件中,您将无法使用 .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..
          }
          

          【讨论】:

            【解决方案9】:
            if (ConfigurationManager.AppSettings.AllKeys.Contains("myKey"))
            {
                // Key exists
            }
            else
            {
                // Key doesn't exist
            }
            

            【讨论】:

            • 如果您以后不想使用该值,这可能会更有效(?)。该问题特别提到了测试“应用程序设置是否可用”。由于可用性意味着在我心中使用它的愿望,我会说 user195488 提供的答案对来这里的人会更有用 - 但严格来说,你的答案也是正确的。
            • 这是一个更好的解决方案,因为它实际上是在检查密钥是否存在。如果我的密钥有空白值,user195488 提供的解决方案会给我一个误报。
            • 此解决方案不正确。 AppSettings 是一个 NameValueCollection,当涉及到键查找时,默认情况下它是不区分大小写的。但是,您在此处使用的 LINQ .Contains 扩展方法将默认为 区分大小写 比较。
            猜你喜欢
            • 2020-01-18
            • 2021-06-11
            • 2023-03-30
            • 2015-12-04
            • 2012-09-08
            • 1970-01-01
            • 2012-09-06
            • 2016-03-21
            • 1970-01-01
            相关资源
            最近更新 更多