如何将Properties.Settings.Default的副本保存为变量?

本文关键字:保存 副本 变量 Default Properties Settings | 更新日期: 2023-09-27 18:03:43

我在一个选项对话框中有一个"恢复默认值"按钮,我想恢复在这个表单中受影响的值,而不是整个属性。settings . default

所以我试了:

var backup = Properties.Settings.Default;
Properties.Settings.Default.Reload();
overwriteControls();
Properties.Settings.Default = backup;

但不幸的是这不起作用,因为备份似乎在Reload()也发生了变化?我为什么要这么做,又该怎么做呢?

如何将Properties.Settings.Default的副本保存为变量?

设置类使用单例模式,这意味着它们在任何时候只能是设置的一个实例。因此,创建该实例的副本将始终指向相同的实例。

理论上,您可以使用反射遍历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按钮后提交值,而不是将值恢复为默认值。无论哪种方式,我认为你都需要将每个值复制到一个属性一个属性的临时位置。