ConfigurationManager & Static Class

2019-02-10 14:49发布

问题:

I would like to use ConfigurationManager to access some string values from a static class. However, I need to handle specifically the absence of a value or the presence of empty values. Right now I was using type initializers, like

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

to do the job. However, if a string with key "abc" doesn't exist in App.config the execution will happilly continue with a null reference in place of someStr. What is, then, the best way to validate this value on initialization? A static constructor in which I initialize the value and then check for validity? I heard static constructors are to be avoided and replaced by type initializers when possible.

回答1:

I'm using something like this:

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

Or to handle empty string:

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


回答2:

This just came up in a code review. The answers provided are great for strings. But they don't work for an int or a double, etc... Today, I needed to do this for a retry count and it needs to be an int.

So here is an answer for those who want Type conversion included.

Use this extension method:

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));
        }
    }
}

I also have unit tests for it, which you can find here: http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

Hope that helps the next guy.



回答3:

static constructors are fine, the great thing about them is that they are guaranteed by the runtime to be executed once and once only - the first time the class is used in any circumstance.

You could alternatively use the coalesce operator (??) to set a default value:

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


标签: c# .net static