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);
}
}
雖然,這是一個有點噁心,如果你的設置,可能需要一些工作是複雜的。你可能想重新考慮你的策略。不要將值恢復爲默認值,只能在按下確定按鈕後才提交值。無論哪種方式,我認爲你將需要將每個值複製到屬性基礎上的某個臨時位置。
您只保存對設置對象的引用,而不是其副本。因此,重新加載*將*更新可用的唯一對象,並且可以通過兩個變量來看到。 – 2013-03-14 03:48:20
所以這是一個指向Properties.Settings.Default或什麼的指針?其實我沒有使用合成器作爲指針......這真讓我困惑......我將如何保存它的副本? – lorus 2013-03-14 03:56:58
.NET使用「引用類型」和「值類型」的概念。類實例是「引用類型」,變量指向它們。它是一個指針,但由運行時管理。爲了複製對象,它必須支持某種形式的「克隆」 - 爲此,使用http://msdn.microsoft.com/en-us/library/system.icloneable.aspx IClonable接口。然而,設置對象並沒有實現它,我不知道如何解決這個問題,沒有進一步的研究,這就是爲什麼我沒有提出這個答案,只是指出你的代碼失敗的原因和原因。 – 2013-03-14 04:13:56