Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AppSettings回退/默认值?_C#_Asp.net_Appsettings_Namevaluecollection_Fallbackvalue - Fatal编程技术网

C# AppSettings回退/默认值?

C# AppSettings回退/默认值?,c#,asp.net,appsettings,namevaluecollection,fallbackvalue,C#,Asp.net,Appsettings,Namevaluecollection,Fallbackvalue,ASP.NET 对于我使用的每个appSetting,我想指定一个值,如果在appSettings中找不到指定的键,那么该值将返回。我正要创建一个类来管理它,但是我想这个功能可能已经在.NET框架的某个地方了 NET中是否有一个NameValueCollection/Hash/etc类型的类,它允许我指定一个键和一个回退/默认值,并返回键的值或指定的值 如果有,我可以在调用之前(从不同的地方)将appSettings放入该类型的对象中。我认为C:\%WIN%\Microsoft.NET下的mac

ASP.NET

对于我使用的每个appSetting,我想指定一个值,如果在appSettings中找不到指定的键,那么该值将返回。我正要创建一个类来管理它,但是我想这个功能可能已经在.NET框架的某个地方了

NET中是否有一个NameValueCollection/Hash/etc类型的类,它允许我指定一个键和一个回退/默认值,并返回键的值或指定的值


如果有,我可以在调用之前(从不同的地方)将appSettings放入该类型的对象中。

我认为C:\%WIN%\Microsoft.NET下的machine.config可以做到这一点。将密钥作为默认值添加到该文件中


您可以创建自定义配置部分,并使用DefaultValue属性提供默认值。这方面的说明是可用的。

我不相信.NET中有任何内置的东西可以提供您想要的功能

您可以基于
Dictionary
创建一个类,该类提供了一个重载
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;
        }
    }
}
字符串索引器上的
键可以是
null
。但我明白在多个地方这样做很痛苦

我就是这么做的

WebConfigurationManager.AppSettings["MyValue"] ?? "SomeDefault")
对于布尔类型和其他非字符串类型

bool.Parse(WebConfigurationManager.AppSettings["MyBoolean"] ?? "false")

您可以围绕ConfigurationManager构建逻辑,以获得检索应用程序设置值的类型化方法。在此使用TypeDescriptor转换值

/// ///ConfigurationManager的实用程序方法 /// 公共静态类配置ManagerRapper {

//
///使用此扩展名方法从配置文件获取强类型应用程序设置。
///如果找到键并尝试将值转换为指定类型,则返回配置文件中的应用程序设置。如果此操作失败,则返回回退值
///或者,如果未指定,则返回应用程序设置的默认值
/// 
/// 
/// 
/// 
/// 
公共静态T GetAppsetting(字符串appsettingKey,T fallback=default(T))
{
字符串val=ConfigurationManager.AppSettings[appsettingKey]??“”;
如果(!string.IsNullOrEmpty(val))
{
尝试
{
类型默认值=类型(T);
var converter=TypeDescriptor.GetConverter(typeof(T));
返回ConvertFrom(typeof(string))?(T)converter.ConvertFrom(val):回退;
}
捕获(异常错误)
{
Console.WriteLine(err);//异常
返回回退;
}
}
返回回退;
}
}

}

Machine.config会给我一个回退值,但我无法在代码中指定它?是这样吗?我正在寻找一种可以让我在代码中指定如果appSettings没有我指定的键应该返回的值的东西。我提到了appSettings,但这个问题与任何NameValueCollection/Hash有关,与appSettings(或*.config)有关。这是另一个很好的答案,说明我的问题问得有多么糟糕。我可能需要根据调用方指定不同的回退/默认值(和/或仅在运行时确定的值)。我不应该提到appSettings,因为我确实需要一个简单的NameValueCollection类型对象,该对象允许我指定在找不到键时返回的值。我提供了一个扩展方法来执行此操作,其中包括TypeConversation:。很明显,这篇文章已经有5年历史了,但像我这样的未来谷歌用户却没有在这里找到答案。
bool.Parse(WebConfigurationManager.AppSettings["MyBoolean"] ?? "false")
    /// <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;
    }

}