Settings 类使用单例模式,这意味着它们在任何时候都只能是设置的一个实例。因此,制作该实例的副本将始终引用同一个实例。
理论上,您可以使用反射遍历 Settings 类中的每个属性并提取如下值:
var propertyMap = new Dictionary<string, object>();
// backup properties
foreach (var propertyInfo in Properties.Settings.Default.GetType().GetProperties())
{
if (propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetCustomAttributes(typeof(UserScopedSettingAttribute), false).Any())
{
var name = propertyInfo.Name;
var value = propertyInfo.GetValue(Properties.Settings.Default, null);
propertyMap.Add(name, value);
}
}
// restore properties
foreach (var propertyInfo in Properties.Settings.Default.GetType().GetProperties())
{
if (propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetCustomAttributes(typeof(UserScopedSettingAttribute), false).Any())
{
var value = propertyMap[propertyInfo.Name];
propertyInfo.SetValue(Properties.Settings.Default, value, null);
}
}
虽然,它有点棘手,如果您的设置很复杂,可能需要一些工作。您可能需要重新考虑您的策略。您只能在按下 OK 按钮后提交这些值,而不是将这些值恢复为默认值。无论哪种方式,我认为您将需要逐个属性地将每个值复制到某个临时位置。