Программно определить, если настройки для пользователя или для приложения

Учитывая произвольные настройки параметра EG Properties.Settings.Default.ArbitraryParam Вы можете программно из приложения сказать, является ли это настройкой для каждого пользователя или для каждого приложения?

В качестве альтернативы, учитывая, что настройки для каждого приложения доступны только для чтения, каков наилучший способ защиты от попыток записи в настройку для каждого приложения? Или ничего не произойдет, если значение не обновляется, когда Properties.Settings.Default.Save() называется?

1 ответ

Решение

Если вы хотите определить, являются ли они пользовательской областью или областью применения, вы можете написать небольшой метод расширения...

public static class SettingsExtensions
{
    public bool IsUserScoped(this Settings settings, string variableName)
    {
        PropertyInfo pi = settings.GetType().GetProperty(variableName, BindingFlags.Instance);

        return pi.GetCustomAttribute<System.Configuration.UserScopedSettingAttribute>() != null;
    }
}

Который тогда называется:

Settings.Default.IsUserScoped("SomeVariableName");

Вы можете сделать еще несколько трюков, если хотите получить фактическое имя из свойства, но оно показывает один из способов. Другой способ - определить, содержит ли свойство get а также set Accessor (пользовательская область) или просто get (область применения).

Это довольно ясно, если вы откроете файл Settings.Designer.cs, вот мой пример файла:

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("blah")]
    public string UserSetting {
        get {
            return ((string)(this["UserSetting"]));
        }
        set {
            this["UserSetting"] = value;
        }
    }

    [global::System.Configuration.ApplicationScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("hardy har har")]
    public string AppSetting {
        get {
            return ((string)(this["AppSetting"]));
        }
    }
}

Заметьте атрибуты? Их можно использовать для определения информации о свойствах.

Тем не менее, еще один хороший способ сказать, что если вы пишете

Settings.Default.SomeAppSetting = some_value;

Вы получите ошибку компилятора, так как нет установленного метода доступа.

Другие вопросы по тегам