2013-03-14 2 views
1

У меня есть «Восстановить значения по умолчанию» кнопку в диалоге с опционами и хочу восстановить значения, которые страдают только в этой форме, а не весь Properties.Settings.DefaultКак сохранить копию Properties.Settings.Default для переменной?

Так что я пытался:

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

Но это, к сожалению, не работает, поскольку резервное копирование, похоже, меняется на Reload(), тоже? Почему и как я буду делать это правильно?

+0

Вы сохраняете ссылку только на объект настроек, а не на его копию. Следовательно, Reload * будет * обновлять один и только объект, который доступен, и вы можете видеть это через обе переменные. –

+0

Так что это указатель на Properties.Settings.Default или что? На самом деле я не использовал synthax для указателя ... это действительно меня смущает ... как я могу сохранить его копию? – lorus

+1

.NET использует концепцию «Типы ссылок» и «Типы значений». Экземпляры класса - это «ссылочные типы», и переменные указывают на них. Это указатель, но он управляется средой выполнения. Чтобы скопировать объект, он должен поддерживать некоторую форму «клонирования» - для этого используется интерфейс http://msdn.microsoft.com/en-us/library/system.icloneable.aspx IClonable. Однако объекты настроек не реализуют его, и я не знаю, как это решить без дальнейших исследований, поэтому я не предлагал это в качестве ответа, просто указывая, где и почему ваш код не прошел. –

ответ

4

В классе настроек используется одноэлементный шаблон, что означает, что они могут быть только одним экземпляром настроек в любой момент времени. Поэтому копирование этого экземпляра всегда будет ссылаться на один и тот же экземпляр.

В теории, можно перебирать каждого из свойств в классе настройки с помощью отражения и извлекать значения, как это:

 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. В любом случае, я думаю, вам нужно будет скопировать каждое из значений в какое-то временное место на основе свойства по свойствам.

+0

Выполнение только значений, когда нажата кнопка OK, именно то, что я хочу сделать. Но мне нужен простой способ сбросить настройки по умолчанию, когда ** «Restore Defaults» ** нажата. Поэтому я решил создать резервную копию настроек, затем перезагрузить(), сбросить элементы управления с этими значениями и затем восстановить резервную копию. Но, возможно, лучше использовать что-то вроде 'checkBox1.Checked = bool.Parse ((string) settings.Properties [" setting1 "]. DefaultValue);' Но это выглядит ужасно: -/ – lorus

+0

Я использовал ваш пример для модульного тестирования где я не хотел, чтобы модульный тест перезаписывал существующие настройки. – rolls

Смежные вопросы