Резервное значение AppSettings/значение по умолчанию?

ASP.NET

Для каждого используемого appSetting я хочу указать значение, которое будет возвращено, если указанный ключ не будет найден в appSettings. Я собирался создать класс для управления этим, но я думаю, что эта функциональность, вероятно, уже где-то в .NET Framework?

Есть ли в .NET класс типа NameValueCollection/Hash/etc, который позволит мне указать ключ и резервное значение/значение по умолчанию и вернуть либо значение ключа, либо указанное значение?

Если есть, я мог бы поместить appSettings в объект этого типа, прежде чем вызывать его (из разных мест).


person lance    schedule 21.09.2010    source источник


Ответы (5)


Я не верю, что в .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;
        }
    }
}

Возможно, вам сойдет с рук strings вместо того, чтобы оставаться в общем.

Также есть DependencyObject из Silverlight и мир WPF, если это варианты.

Конечно, самый простой способ - это что-то вроде этого с NameValueCollection:

string value = string.IsNullOrEmpty(appSettings[key]) 
    ? defaultValue 
    : appSettings[key];

key может быть null в индексаторе строк. Но я понимаю, что это больно делать это в нескольких местах.

person Heretic Monkey    schedule 21.09.2010
comment
Для этого я предоставил метод расширения, включающий преобразование типов: stackoverflow.com/a/34053423/375727. Очевидно, не для ОП, так как этому посту 5 лет, но для будущих гуглов, таких как я, которые не нашли здесь ответа. - person Rhyous; 03.12.2015

Это то, что я делаю.

WebConfigurationManager.AppSettings["MyValue"] ?? "SomeDefault")

Для логических и других нестроковых типов...

bool.Parse(WebConfigurationManager.AppSettings["MyBoolean"] ?? "false")
person Carter Medlin    schedule 30.08.2017

Вы можете создать пользовательский раздел конфигурации и указать значения по умолчанию, используя атрибут DefaultValue. Инструкции для этого доступны здесь.

person DoctorFoo    schedule 21.09.2010
comment
Еще один хороший ответ, который показывает, насколько плохо я задал свой вопрос. Мне может потребоваться указать разные резервные значения/значения по умолчанию в зависимости от вызывающего абонента (и/или значения, которые определяются только во время выполнения). Я не должен был упоминать appSettings, так как мне действительно нужен просто объект типа NameValueCollection, который позволяет мне указать возвращаемое значение, если ключ не найден. - person lance; 21.09.2010

Я думаю, что machine.config в папке C:\%WIN%\Microsoft.NET сделает это. Добавьте ключи в этот файл в качестве значений по умолчанию.

http://msdn.microsoft.com/en-us/library/ms228154.aspx

person Dave Swersky    schedule 21.09.2010
comment
Machine.config даст мне резервное значение, но я не смогу указать его в коде? Это правильно? Я ищу что-то, что позволяет мне указать в коде значение, которое должно быть возвращено, если в appSettings нет указанного мною ключа. Я упоминаю appSettings, но этот вопрос касается как любого NameValueCollection/Hash, так и конкретно appSettings (или *.config). - person lance; 21.09.2010

Вы можете построить логику вокруг ConfigurationManager, чтобы получить типизированный способ получения значения параметра вашего приложения. Использование здесь TypeDescriptor для преобразования значения.

/// /// Вспомогательные методы для ConfigurationManager /// public static class 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;
    }

}

}

person Tore Aurstad    schedule 20.02.2019