给定一个任意设置参数EG Properties.Settings.Default.ArbitraryParam
,如果这是每用户或每个应用程序设置,您可以从应用程序中以编程方式告诉吗?
或者,假设每个应用程序设置是只读的,那么防止尝试写入每个应用程序设置的最佳做法是什么?或者,在调用Properties.Settings.Default.Save()
时,除了未更新的值之外,什么都不会发生?
答案 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");
如果你想从一个属性中获取实际名称,你可以做更多的技巧,但它显示了一种方法。另一种方法是确定属性是否包含get
和set
访问者(用户作用域)或仅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;
由于没有设置访问器,您将收到编译器错误。