2013-03-14 63 views
1

我有一個選項對話框中「恢復默認值」按鈕,並希望恢復在這種形式不僅影響了值,而不是整個Properties.Settings.Default如何將Properties.Settings.Default的副本保存到變量中?

所以,我想:

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

但是,這不幸的是不工作,因爲備份似乎也在Reload()改變?爲什麼以及如何正確地做到這一點?

+0

您只保存對設置對象的引用,而不是其副本。因此,重新加載*將*更新可用的唯一對象,並且可以通過兩個變量來看到。 – 2013-03-14 03:48:20

+0

所以這是一個指向Properties.Settings.Default或什麼的指針?其實我沒有使用合成器作爲指針......這真讓我困惑......我將如何保存它的副本? – lorus 2013-03-14 03:56:58

+1

.NET使用「引用類型」和「值類型」的概念。類實例是「引用類型」,變量指向它們。它是一個指針,但由運行時管理。爲了複製對象,它必須支持某種形式的「克隆」 - 爲此,使用http://msdn.microsoft.com/en-us/library/system.icloneable.aspx IClonable接口。然而,設置對象並沒有實現它,我不知道如何解決這個問題,沒有進一步的研究,這就是爲什麼我沒有提出這個答案,只是指出你的代碼失敗的原因和原因。 – 2013-03-14 04:13:56

回答

4

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

雖然,這是一個有點噁心,如果你的設置,可能需要一些工作是複雜的。你可能想重新考慮你的策略。不要將值恢復爲默認值,只能在按下確定按鈕後才提交值。無論哪種方式,我認爲你將需要將每個值複製到屬性基礎上的某個臨時位置。

+0

按下「確定」按鈕時僅提交值正是我想要執行的操作。但是當按下「恢復默認值」**時,我需要一種簡單的方法將控件重置爲默認值。所以我想我會備份設置,然後執行'Reload()',使用該值重置控件,然後恢復備份。但也許它更好地使用'checkBox1.Checked = bool.Parse((string)settings.Properties [「setting1」]。DefaultValue);'但這看起來有點可怕: -/ – lorus 2013-03-15 15:41:25

+0

我用你的例子進行單元測試我不希望單元測試覆蓋現有的設置。 – rolls 2017-03-19 03:42:35

相關問題