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

2024-05-05

我有一个“恢复默认值”选项对话框中的按钮,并且想要恢复仅在此表单中受影响的值,而不是整个 Properties.Settings.Default

所以我尝试:

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

但不幸的是,这不起作用,因为备份似乎在Reload(), 也?为什么以及如何正确地执行此操作?


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);                    
            }
        }

不过,这有点麻烦,如果您的设置很复杂,可能需要一些工作。您可能需要重新考虑您的策略。您只能在按下“确定”按钮后提交这些值,而不是将这些值恢复为默认值。无论哪种方式,我认为您都需要将每个值逐个属性复制到某个临时位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Properties.Settings.Default 的副本保存到变量? 的相关文章

随机推荐