จะตรวจสอบได้อย่างไรว่ามีคีย์การตั้งค่าแอพ


146

ฉันจะตรวจสอบเพื่อดูว่ามีการตั้งค่าแอปพลิเคชันได้อย่างไร

เช่น app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key ="someKey" value="someValue"/>
  </appSettings>
</configuration>

และใน codefile

if (ConfigurationManager.AppSettings.ContainsKey("someKey"))
{
  // Do Something
}else{
  // Do Something Else
}

คำตอบ:


223

MSDN: เครื่องมือจัดการการกำหนดค่าการตั้งค่า

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

ไม่ผิด หาก "myKey" ไม่มีอยู่ในแอป xml ของการตั้งค่าแอปรหัสจะมีข้อยกเว้น
Gionata

หากคุณตรวจสอบ IsNullOrEmpty แล้วตรรกะของคุณสำหรับ "คีย์ไม่มีอยู่" จะทำงานเมื่อคุณมีคีย์ที่มีค่าสตริงว่างเปล่าเป็นการตั้งค่าที่ถูกต้อง
nrjohnstone

3
ไม่ใช่คำตอบที่ดีที่สุดเนื่องจากจะทำให้เกิดข้อยกเว้น Divyesh Patel เป็นทางออกที่ดีกว่า
VRPF

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

นี่อาจจะมีประสิทธิภาพมากกว่าเล็กน้อย (?) หากคุณไม่ต้องการใช้ค่าในภายหลัง คำถามดังกล่าวกล่าวถึงการทดสอบโดยเฉพาะ 'หากมีการตั้งค่าแอปพลิเคชัน' เนื่องจากความพร้อมใช้งานแสดงถึงความต้องการที่จะใช้ในใจของฉันฉันจะบอกว่าคำตอบที่ได้รับจากผู้ใช้ 195488 จะมีประโยชน์มากกว่าสำหรับคนที่มาที่นี่ - แต่การพูดอย่างเคร่งครัดคำตอบของคุณก็ถูกต้องเช่นกัน
รหัส Jockey

10
นี่เป็นทางออกที่ดีกว่าสำหรับความจริงง่ายๆที่ตรวจสอบว่ามีคีย์อยู่หรือไม่ หากฉันมีค่าว่างสำหรับคีย์ของฉันการแก้ปัญหาที่จัดทำโดย user195488 จะให้ค่าบวกผิด
dyslexicanaboko

6
วิธีนี้ไม่ถูกต้อง AppSettings เป็น NameValueCollection ซึ่งโดยค่าเริ่มต้นจะไม่คำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเมื่อต้องค้นหาคีย์ วิธีการขยาย LINQ .Contains ที่คุณใช้ที่นี่ แต่จะใช้การเปรียบเทียบแบบตัวพิมพ์ใหญ่ -เล็ก
Jax

9

ส่งคืนค่าเริ่มต้นอย่างปลอดภัยผ่าน generics และ 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 ฉันต้องการความไวตัวพิมพ์เล็กและพิมพ์ใหญ่เพื่อจัดการมัน
codebender

การเปรียบเทียบแบบ case-insensitive ที่เหมาะสมนั้นเร็วขึ้นด้วย ToUpper (ดูstackoverflow.com/a/12137/389424 ) แม้ beter คือการใช้ string.Equals () เกินพิกัดผ่าน StringComparisonType
janv8000

นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับปัญหานี้ ฉันได้ปรับเปลี่ยนการใช้งานเล็กน้อยเพื่อสนับสนุนแนวคิดของการตั้งค่าที่จำเป็น มีเพียงสิ่งเดียว - อย่าลืมเพิ่มusing System.ComponentModel;คำแถลงในชั้นเรียนของคุณเพื่อรองรับการใช้TypeDescriptorชั้นเรียน
STLDev


2

หากคีย์ที่คุณต้องการไม่มีอยู่ในไฟล์กำหนดค่าคุณจะไม่สามารถแปลงเป็นสตริงด้วย. ToString () เนื่องจากค่าจะเป็นโมฆะและคุณจะได้รับ "การอ้างอิงวัตถุไม่ได้ตั้งค่าไว้ ข้อผิดพลาดของอินสแตนซ์ของวัตถุ วิธีที่ดีที่สุดคือการดูว่ามีค่าอยู่ก่อนที่จะลองรับค่าสตริงหรือไม่

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 - มีข้อได้เปรียบจากวิธีนี้หรือไม่? ถ้าฉันมีความเชี่ยวชาญใน Linq จริงๆ (ซึ่งโปรแกรมเมอร์ C # ส่วนใหญ่อาจจะเป็นในที่สุด) จากนั้นก็คงเป็นเรื่องง่ายที่จะอ่านตัวอย่างนี้ แต่ฉันไม่คิดว่ามันจะง่ายกว่านี้ - เว้นแต่จะมีข้อได้เปรียบด้านประสิทธิภาพ ... ทำไม
รหัส Jockey

ไม่มีข้อได้เปรียบด้านประสิทธิภาพและการสร้างประโยคโดยละเอียด
John Nicholas

1
ConfigurationManager.AppSettingsไม่Any(key => key == MyKey
คำนึงถึงขนาดตัวพิมพ์

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

การใช้ไวยากรณ์ c # ใหม่กับ TryParse ทำงานได้ดีสำหรับฉัน:

  // 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.