ASP.NET
对于我使用的每个appSetting,我想指定一个值,如果在appSettings中找不到指定的键,将返回该值。我打算创建一个类来管理它,但我认为这个功能可能已经在某个.NET Framework中了?
.NET中是否有一个NameValueCollection / Hash / etc-type类,它允许我指定一个键和一个回退/默认值 - 并返回键的值或指定的值?
如果有,我可以在调用之前将appSettings放入该类型的对象中(来自不同的地方)。
答案 0 :(得分:2)
我不相信.NET内置任何内容可以提供您正在寻找的功能。
您可以创建一个基于Dictionary<TKey, TValue>
的类,它提供TryGetValue
的重载以及一个默认值的附加参数,例如:
public class MyAppSettings<TKey, TValue> : Dictionary<TKey, TValue>
{
public void TryGetValue(TKey key, out TValue value, TValue defaultValue)
{
if (!this.TryGetValue(key, out value))
{
value = defaultValue;
}
}
}
你可能可以使用string
而不是保持通用。
如果可以选择Silverlight和WPF世界,还有DependencyObject。
当然,最简单的方法就是使用NameValueCollection
:
string value = string.IsNullOrEmpty(appSettings[key])
? defaultValue
: appSettings[key];
字符串索引器上的 key
可以是null
。但我明白在多个地方做这件事很痛苦。
答案 1 :(得分:2)
这就是我的工作。
WebConfigurationManager.AppSettings["MyValue"] ?? "SomeDefault")
对于布尔值和其他非字符串类型......
bool.Parse(WebConfigurationManager.AppSettings["MyBoolean"] ?? "false")
答案 2 :(得分:1)
您可以使用DefaultValue属性创建自定义配置部分并提供默认值。有关该说明的说明here。
答案 3 :(得分:0)
我认为C:\%WIN%\ Microsoft.NET下的machine.config会这样做。将密钥添加到该文件作为默认值。
答案 4 :(得分:0)
您可以围绕ConfigurationManager构建逻辑,以获取输入应用程序设置值的类型化方法。在此处使用TypeDescriptor转换值。
/// /// ConfigurationManager的实用程序方法 /// 公共静态类ConfigurationManagerWrapper {
/// <summary>
/// Use this extension method to get a strongly typed app setting from the configuration file.
/// Returns app setting in configuration file if key found and tries to convert the value to a specified type. In case this fails, the fallback value
/// or if NOT specified - default value - of the app setting is returned
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="appsettingKey"></param>
/// <param name="fallback"></param>
/// <returns></returns>
public static T GetAppsetting<T>(string appsettingKey, T fallback = default(T))
{
string val = ConfigurationManager.AppSettings[appsettingKey] ?? "";
if (!string.IsNullOrEmpty(val))
{
try
{
Type typeDefault = typeof(T);
var converter = TypeDescriptor.GetConverter(typeof(T));
return converter.CanConvertFrom(typeof(string)) ? (T)converter.ConvertFrom(val) : fallback;
}
catch (Exception err)
{
Console.WriteLine(err); //Swallow exception
return fallback;
}
}
return fallback;
}
}
}