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

C# 如何将Properties.Settings.Default的副本保存到变量?,c#,winforms,settings,C#,Winforms,Settings,我在选项对话框中有一个“还原默认值”按钮,只想还原此表单中受影响的值,而不想还原整个Properties.Settings.Default 所以我试着: var backup = Properties.Settings.Default; Properties.Settings.Default.Reload(); overwriteControls(); Properties.Settings.Default = backup; 但不幸的是,这不起作用,因为备份似乎在Reload()时也发生了变

我在选项对话框中有一个“还原默认值”按钮,只想还原此表单中受影响的值,而不想还原整个Properties.Settings.Default

所以我试着:

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

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

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

理论上,您可以使用反射迭代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);                    
            }
        }
var-propertyMap=new Dictionary();
//备份属性
foreach(Properties.Settings.Default.GetType().GetProperties()中的var propertyInfo)
{
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(名称、值);
}
}
//恢复属性
foreach(Properties.Settings.Default.GetType().GetProperties()中的var propertyInfo)
{
if(propertyInfo.CanRead&&propertyInfo.CanWrite&&propertyInfo.GetCustomAttributes(typeof(UserScopedSettingAttribute),false)。Any()
{
var value=propertyMap[propertyInfo.Name];
propertyInfo.SetValue(Properties.Settings.Default,value,null);
}
}

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

您只保存对设置对象的引用,而不是其副本。因此,重载将更新唯一可用的对象,您可以通过这两个变量看到它?实际上我没有用Syntax作为指针。。。这真让我困惑。。。如何保存它的副本?.NET使用“引用类型”和“值类型”的概念。类实例是“引用类型”,变量指向它们。它是一个指针,但由运行时管理。为了复制一个对象,它必须支持某种形式的“克隆”——IClonable接口用于此。然而,设置对象没有实现它,我不知道如何解决这个问题,没有进一步的研究,这就是为什么我没有提出这个问题作为答案,只是指出你的代码失败的地方和原因。只有在按下OK按钮时提交值才是我想要做的。但我需要一种简单的方法,当按下“恢复默认值”时,将控件重置为默认值。所以我想我备份了设置,然后重新加载(),用该值重置控件,然后恢复备份。但是最好使用
checkBox1.Checked=bool.Parse((string)settings.Properties[“setting1”].DefaultValue)之类的东西但这看起来有点糟糕:-/我用你的例子进行单元测试,我不希望单元测试覆盖现有的设置。