2010-07-20 14 views
104

Làm cách nào để kiểm tra xem liệu Cài đặt ứng dụng có khả dụng không?Cách kiểm tra xem khóa ứng dụng có tồn tại không?

ví dụ app.config

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

và trong CodeFile

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

Trả lời

160

MSDN: Configuration Manager.AppSettings

if (ConfigurationManager.AppSettings[name] != null) 
{ 
// Now do your magic.. 
} 

hoặc

string s = ConfigurationManager.AppSettings["myKey"]; 
if (!String.IsNullOrEmpty(s)) 
{ 
    // Key exists 
} 
else 
{ 
    // Key doesn't exist 
} 
+2

Chúng tôi có một [Hàm IsNull SQL-like] (https://gist.github.com/eithe/5589891) trong thư viện của chúng tôi mà làm lấy một khung cảnh rất tiện dụng: 'Dim configValue As String = Util.IsNull (ConfigurationManager.AppSettings.Get (" SettingName "), String.Empty)' –

+7

Nó ném "Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng" –

+0

Không, không đúng. Nếu "myKey" không tồn tại trong nút xml cài đặt ứng dụng, mã sẽ bị loại trừ. – Gionata

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

Điều này có thể sẽ hiệu quả hơn một chút (?) Nếu bạn không muốn sử dụng giá trị sau đó. Câu hỏi cụ thể đề cập đến thử nghiệm 'nếu một Cài đặt ứng dụng khả dụng'. Vì tính sẵn có ngụ ý mong muốn sử dụng nó trong tâm trí của tôi, tôi muốn nói câu trả lời được cung cấp bởi user195488 sẽ hữu ích hơn cho những người đến đây - nhưng nói đúng, câu trả lời của bạn cũng chính xác. –

+5

Đây là một giải pháp tốt hơn cho thực tế đơn giản là nó thực sự kiểm tra xem khóa có tồn tại hay không. Nếu tôi có giá trị trống cho khóa của tôi, giải pháp được cung cấp bởi user195488 sẽ cho tôi một kết quả dương tính giả. – dyslexicanaboko

+2

Giải pháp này không chính xác. AppSettings là một NameValueCollection mà theo mặc định là ** phân biệt chữ hoa chữ thường ** khi nói đến tra cứu chính. Phương pháp mở rộng LINQ .Contains bạn đang sử dụng ở đây tuy nhiên sẽ mặc định so sánh ** phân biệt chữ hoa chữ thường **. – Jax

2

Nếu khóa bạn đang tìm không có trong tệp cấu hình, bạn sẽ không thể chuyển đổi nó thành chuỗi bằng .ToString() vì giá trị sẽ là rỗng và bạn sẽ nhận được "Tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng" lỗi. Tốt nhất là trước tiên hãy xem liệu giá trị có tồn tại hay không trước khi cố gắng lấy biểu diễn chuỗi.

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

Hoặc, như Mã Khỉ gợi ý:

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

tùy chọn Upper cho linh hoạt cho tất cả các cách, nếu bạn biết loại chìa khóa thử phân tích chúng bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);

3

Tôi nghĩ rằng biểu thức LINQ có thể tốt nhất:

const string MyKey = "myKey" 

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

chắc chắn ... nhưng idunno - có bất kỳ _advantage_ nào với phương pháp này không? Nếu tôi hoàn toàn thành thạo trong LINQ (hầu hết các lập trình viên C# có thể sẽ là), thì có lẽ sẽ dễ dàng đọc ví dụ này, nhưng tôi không nghĩ nó sẽ là _easier_ - vì vậy trừ khi có lợi thế về hiệu quả ... tại sao? –

+0

không có lợi thế về hiệu quả và cú pháp chi tiết. –

2

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

3

Giá trị mặc định trả về một cách an toàn thông qua Generics và LINQ.

public T ReadAppSetting<T>(string searchKey, T defaultValue) 
{ 
    if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == searchKey)) 
    { 
     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 default 
    } 
    return defaultValue; 
} 

Được sử dụng như sau:

string LogFileName = ReadAppSetting("LogFile","LogFile"); 
double DefaultWidth = ReadAppSetting("Width",1280.0); 
double DefaultHeight = ReadAppSetting("Height",1024.0); 
Color DefaultColor = ReadAppSetting("Color",Colors.Black);