例如,当您访问时:
myColor
实际上,您将获得{{1}}的当前设置,而不是在程序开发期间设置的原始设置。
我正在寻找它-最初设置为默认值的值。删除当前设置后,可以再次看到它们。
当然,我正在寻找一种无需删除当前设置即可获取这些值的API。
答案 0 :(得分:1)
您可以通过属性名称通过以下方式找到设置属性的默认值:
var value = (string)Properties.Settings.Default.Properties["propertyName"].DefaultValue;
但是返回的值是属性值的string
表示形式,例如,如果您查看Settings.Designer.cs
,则会看到该属性装饰有存储默认值{{1}的属性}。在这种情况下,以上代码的返回值将为[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);
}
}
答案 1 :(得分:0)
我没有找到任何现有的API,但是我需要它……
我让VS为整个设置创建界面(在用户部分,而不是设计者):
internal sealed partial class Settings : ISettings
这只是为了同时使用两种设置(当前设置和默认设置)
接口看起来像这样:
internal interface ISettings
{
bool AskForNewDescription { get; }
...
我创建了默认设置类:
internal sealed class DefaultSettings : ISettings
{
public bool AskForNewDescription => GetDefault<bool>();
我并未针对所有可能的情况对其进行测试,但它对我有用:
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);
}