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)
에이 릭 H

10
그것은 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"발생
Waqar 알람 거

아니, 잘못 됐어 앱 설정 xml 노드에 "myKey"가 없으면 코드에서 예외가 발생했습니다.
Gionata 2016 년

IsNullOrEmpty를 확인하면 실제로 유효한 설정으로 빈 문자열 값을 가진 키가있을 때 "key does not exist"에 대한 논리가 실행됩니다
nrjohnstone

3
이것이 예외를 던지므로 가장 좋은 대답은 아닙니다. Divyesh Patel이 더 나은 솔루션입니다.
VRPF

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

나중에 값을 사용하고 싶지 않으면 약간 더 효율적일까요 (?). 이 질문에는 구체적으로 '응용 프로그램 설정이 가능한 경우'테스트가 언급되어 있습니다. 가용성은 내 마음에 그것을 사용하려는 욕구를 암시하기 때문에 user195488이 제공 한 답변이 여기 오는 사람들에게 더 유용 할 것이라고 말하지만 엄격하게 말하면 귀하의 답변도 정확합니다.
Code Jockey

10
이것은 실제로 키가 있는지 확인하는 단순한 사실에 대한 훨씬 더 나은 솔루션입니다. 내 키에 빈 값이 있으면 user195488에서 제공 한 솔루션은 잘못된 긍정을 줄 것입니다.
dyslexicanaboko

6
이 솔루션은 올바르지 않습니다. AppSettings는 기본 조회에서 키를 조회 할 때 대소 문자를 구분하지 않는 NameValueCollection입니다 . LINQ. 여기에 사용하는 확장 방법이 포함되어 있지만 기본적으로 대 / 소문자를 구분 합니다.
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.AppSettingsAny(key => key == MyKey그러나 대소 문자를 구분하지는 않습니다.
janv8000

@ janv8000 대소 문자 구분을 원했지만 처리하기 위해 예제를 업데이트했습니다.
codebender

ToUpper를 사용하면 대소 문자를 구분하지 않는 적절한 비교가 더 빠릅니다 ( stackoverflow.com/a/12137/389424 참조 ). 심지어 더 나은 것은 StringComparisonType을 전달하는 string.Equals () 오버로드를 사용하는 것입니다.
janv8000

이것은 문제에 대한 훌륭한 해결책입니다. 필요한 설정 개념을 지원하기 위해 구현을 약간 수정했습니다. 한 가지만 – using System.ComponentModel;클래스 사용을 지원하기 위해 클래스에 문장 을 추가 해야합니다 TypeDescriptor.
STLDev

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

2

찾고있는 키가 구성 파일에 없으면 값이 null이고 "개체 참조가 설정되지 않기 때문에 .ToString ()을 사용하여 문자열로 변환 할 수 없습니다. 오류가 발생했습니다 "오류가 발생했습니다. 문자열 표현을 얻으려면 먼저 값이 존재하는지 확인하는 것이 가장 좋습니다.

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- 이 방법에 이점 이 있습니까? 내가 정말 잘 (대부분의 C # 프로그래머는 아마도 결국 예정) Linq에에 정통하고있어 경우에, 아마 것 쉬운으로 이 예제를 읽고,하지만 난 그 어느 것 생각하지 않아 쉽게 - 그래서 효율 이점이 아니라면 ... 왜?
Code Jockey

효율성 이점이없고 구문 상 장황한 imo.
John Nicholas

1
ConfigurationManager.AppSettings대소 문자를 구분하지는 Any(key => key == MyKey않지만
janv8000

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에 오신 것을 환영합니다! 답변을 게시 할 때 솔루션을 조금 설명해보십시오. 이 경우 답변이 몇 가지 더 있습니다. 전문가를 노출 시키십시오.
David García Bodego
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.