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
}

回答:


223

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
}

2
我々は持っているのIsNull SQLに似た機能は非常に便利な設定を取得します私たちの図書館では:Dim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
Eirik H

10
「オブジェクト参照がオブジェクトのインスタンスに設定されていません」をスローする
Waqar Alamgir 2013年

いいえ、それは間違っています。「myKey」がアプリ設定xmlノードに存在しない場合、コードは例外をスローしました。
Gionata

IsNullOrEmptyをチェックすると、有効な設定として空の文字列値を持つキーが実際にある場合、「キーが存在しません」のロジックが実行されます
nrjohnstone

3
これは例外をスローするため、最良の答えではありません。Divyesh Patelはより良いソリューションです。
VRPF 2016年

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

後で値を使用したくない場合は、これはおそらく少し効率的です(?)。質問では、「アプリケーション設定が使用可能な場合」のテストについて具体的に言及しています。可用性は私の心の中でそれを使用したいという欲求を意味するので、user195488によって提供された答えは、ここに来る人々にとってより役立つでしょう-しかし厳密に言えば、あなたの答えも正しいです。
コードジョッキー

10
これは、キーが存在するかどうかを実際にチェックしているという単純な事実に対して、はるかに優れたソリューションです。キーの値が空白の場合、user195488が提供するソリューションでは、誤検出が発生します。
dyslexicanaboko 2014

6
このソリューションは正しくありません。AppSettingsはNameValueCollectionであり、キールックアップに関してはデフォルトで大文字と小文字が区別されませ。ここで使用しているLINQ .Contains拡張メソッドは、デフォルトで大文字と小文字を区別する比較になります。
Jax

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 '19

@ janv8000大文字と小文字を区別したかったのですが、それを処理するように例を更新しました。
codebender '19

ToUpperを使用すると、大文字と小文字を区別しない適切な比較が速くなります(stackoverflow.com/a/12137/389424を参照)。さらに、StringComparisonTypeを渡すstring.Equals()オーバーロードを使用することもできます。
janv8000

これは問題に対する本当に素晴らしい解決策です。必要な設定の概念をサポートするために、実装を少し変更しました。ただ1つのこと- using System.ComponentModel;クラスの使用をサポートするために、TypeDescriptorクラスにステートメントを追加することを忘れないでください。
STLDev

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

2

探しているキーが構成ファイルに存在しない場合、値がnullになり、「オブジェクト参照が設定されていません。オブジェクトのインスタンスへ」エラー。文字列表現を取得する前に、値が存在するかどうかを最初に確認することをお勧めします。

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

または、Code Monkeyが示唆したように:

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- この方法には利点がありますか?私は本当によく(ほとんどのC#プログラマは、おそらく最終的になります)のLINQに精通していた場合、それはおそらくだろうくらい簡単にこの例を読むために、私はそれが今までになるとは思わないが容易 -ので、効率の利点がありますしない限り、 ... なぜ?
コードジョッキー

効率上の利点はなく、構文的に冗長なimo。
John Nicholas

1
ConfigurationManager.AppSettings大文字と小文字は区別されませんAny(key => key == MyKeyが、
janv8000 '19

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.