2011-08-25 31 views
5

我想用ConfigurationManager訪問靜態類的一些字符串值。但是,我需要特別處理缺少值或存在空值的情況。現在我正在使用類型初始值設定項,如ConfigurationManager&Static類

private static readonly string someStr = ConfigurationManager.AppSettings["abc"]; 

要完成這項工作。但是,如果在App.config中不存在帶有鍵「abc」的字符串,則執行將繼續以null引用代替someStr。那麼,在初始化時驗證這個值的最好方法是什麼?一個靜態構造函數,我在其中初始化該值,然後檢查有效性?我聽說要避免使用靜態構造函數,並儘可能使用類型初始化函數替換。

回答

6

我使用的是這樣的:

public static readonly string someStr = 
     ConfigurationManager.AppSettings["abc"] ?? "default value"; 

或者處理空字符串:

public static readonly string someStr = 
      !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
          ConfigurationManager.AppSettings["abc"] : "default value"; 
2

靜態構造函數都很好,對他們的偉大的事情是,他們是通過保證運行時只能執行一次 - 這是第一次在任何情況下使用該類。

你可以選擇使用聚結運營商(??)設置默認值:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value"; 
4

這只是一個代碼審查上來。所提供的答案對於字符串來說很好。但他們不適用於int或double等...今天,我需要做一個重試計數,它需要一個int。

因此,這裏是對那些想要包括類型轉換的人的答案。

使用此擴展方法:

using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Rhyous.Config.Extensions 
{ 
    public static class NameValueCollectionExtensions 
    { 
     public static T Get<T>(this NameValueCollection collection, string key, T defaultValue) 
     { 
      var value = collection[key]; 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 
      if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value)) 
      { 
       return defaultValue; 
      } 

      return (T)(converter.ConvertFromInvariantString(value)); 
     } 
    } 
} 

我也有它的單元測試,你可以在這裏找到:http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

希望幫助未來的傢伙。

+0

這是現在在我的Rhyous.Collections NuGet包中,你可以在GitHub上看到源代碼:https://github.com/rhyous/Collections/blob/master/src/Rhyous.Collections/Extensions/NameValueCollectionExtensions.cs – Rhyous