以编程方式确定设置是按用户还是按应用程序

时间:2015-08-11 15:32:04

标签: c# .net application-settings settings

给定一个任意设置参数EG Properties.Settings.Default.ArbitraryParam,如果这是每用户或每个应用程序设置,您可以从应用程序中以编程方式告诉吗?

或者,假设每个应用程序设置是只读的,那么防止尝试写入每个应用程序设置的最佳做法是什么?或者,在调用Properties.Settings.Default.Save()时,除了未更新的值之外,什么都不会发生?

1 个答案:

答案 0 :(得分: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");

如果你想从一个属性中获取实际名称,你可以做更多的技巧,但它显示了一种方法。另一种方法是确定属性是否包含getset访问者(用户作用域)或仅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;

由于没有设置访问器,您将收到编译器错误。