Есть ли API для получения оригинальных Properties.Settings? - PullRequest
0 голосов
/ 03 июля 2018

При доступе к примеру:

Properties.Settings.Default.myColor

на самом деле вы получите текущую настройку значения myColor, а не оригинальную настройку, которая была установлена ​​при разработке программы.

И я ищу именно это - значения, которые были изначально установлены по умолчанию. Их снова можно увидеть после удаления текущих настроек.

Конечно, я ищу API для получения этих значений без удаления текущих настроек.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете найти значение по умолчанию для свойства настройки по имени свойства следующим образом:

var value = (string)Properties.Settings.Default.Properties["propertyName"].DefaultValue;

Но возвращаемое значение является string представлением значения свойства, например, если вы посмотрите на Settings.Designer.cs, вы увидите, что свойство украшено атрибутом, в котором хранится значение по умолчанию [DefaultSettingValueAttribute("128, 128, 255")]. В этом случае возвращаемое значение для вышеуказанного кода будет "128, 128, 225".

Чтобы получить значение по умолчанию в исходном типе свойства, я создал следующий метод расширения:

using System.ComponentModel;
using System.Configuration;
public static class SettingsExtensions
{
    public static object GetDefaultValue(this ApplicationSettingsBase settings,
        string propertyName)
    {
        var property = settings.Properties[propertyName];
        var type = property.PropertyType;
        var defaultValue = property.DefaultValue;
        return TypeDescriptor.GetConverter(type).ConvertFrom(defaultValue);
    }
}

Тогда как использование:

var myColor = (Color)Properties.Settings.Default.GetDefaultValue("myColor");
0 голосов
/ 03 июля 2018

Я не нашел ни одного существующего API, но он мне нужен был так ...

  1. Я сделал VS для создания интерфейса для всех настроек (в пользовательской части, а не дизайнера):

    internal sealed partial class Settings : ISettings
    

только для упрощения использования обеих настроек (текущих и по умолчанию)

  1. Интерфейс выглядит следующим образом:

    internal interface ISettings
    {
      bool AskForNewDescription { get;  }
      ...
    
  2. Я создал класс настроек по умолчанию:

    internal sealed class DefaultSettings : ISettings
    {
      public bool AskForNewDescription => GetDefault<bool>();
    
  3. Я не проверял его для всех возможных случаев, но он работает для меня:

    private readonly ISettings source;
    
    private string GetSerialized(string name)
    {
        var prop = this.source.GetType().GetProperty(name);
        foreach (object attr in prop.GetCustomAttributes(true))
        {
            var val_attr = attr as DefaultSettingValueAttribute;
            if (val_attr != null)
                return val_attr.Value;
        }
    
        return null;
    }
    
    private T GetDefault<T>([CallerMemberName] string name = null)
    {
        string s = GetSerialized(name);
        if (s == null)
            return default(T);
    
        TypeConverter tc = TypeDescriptor.GetConverter(typeof(T));
        return (T)tc.ConvertFromString(s);
    }
    
...