无论如何重建一个内部的对象?

时间:2015-06-18 11:21:59

标签: c# .net

我有一个简单的类,用于winforms应用程序的选项。应该有一种方法可以将选项重置为默认值。我知道我可以添加一个单独的方法来处理这个,但代码将是巨大的(如果我向该类添加更多选项):

public SensorOptions()
{
    ShowLabelMax = ShowLabelMin = ShowLabelAvr = ShowReceivedTextBox = true;

    ChartMaxValue = 140;
    ChartMinValue = -40;

    ShowChartMinValue = ShowChartMaxValue = ShowChartAvrValue = ShowChartAvrLine = true;

    LogFolder = Environment.SpecialFolder.MyDocuments.ToString();
    LoggingEnabled = true;
}

public void ResetOptions()
{
    this = new SensorOptions(); //can not do. 'this' is read-only
}

我的意思是我可以将构造函数中的代码复制/粘贴到ResetOptions()方法中。但有没有更智能的方法来实现这一目标?

3 个答案:

答案 0 :(得分:4)

将构造函数中的所有代码移动到ResetOptions方法中,然后在构造函数中调用ResetOptions方法。您的初始化代码只在一个地方。

答案 1 :(得分:4)

您无法指定this,因为您可能在程序中引用了此类的实例。如果您可以通过重新分配this来重新构造对象,则意味着对该类的旧实例的所有引用都将变为无效。

无论你在课堂上有多少选项,你都可以用一种或另一种方式初始化它们(因为你在问题中提到了default value - 所以你需要在某个地方至少分配一次默认值,可能在构造函数中)。因此,您的问题的解决方案很简单 - 将所有初始化程序移动到单独的方法并在构造函数中调用它,然后每次需要将选项重置为默认值时调用它。

如果未明确为任何选项分配默认值,并且使用系统默认值,并且您不想为每个选项编写option=default(optionType),则可以使用反射来枚举该类中的所有字段/属性并为它们分配默认值,如下所示:

public static object GetDefault(Type type)
{
   if(type.IsValueType) return Activator.CreateInstance(type);
   return null;
}
foreach(var field in this.GetType().GetFields())
    field.SetValue(this, GetDefault(field.FieldType));
foreach(var prop in this.GetType().GetProperties())
    prop.SetValue(this, GetDefault(prop.PropertyType));

答案 2 :(得分:2)

您的情况非常简单。在我看来,最好为此应用一个技巧: 你有一个类可以保存所有选项(伪代码):

class AllOptionsBackstage
{
   public bool ShowLabelMax { get; set; }
   public bool ShowLabelMin { get; set; }
   public bool ShowLabelAvr { get; set; }

   public AllOptionsBackstage()
   {
      // apply default values here
   }
}  

.....


class MyOptions
{
   private AllOptionsBackstage _options;

   public MyOptions()
   { 
      Reset();  
   }

   public bool ShowLabelMax 
   {
     get{ return _options.ShowLabelMax; } 
     set{ _options.ShowLabelMax = value; }
   }

   public bool ShowLabelMin 
   {
     get{return _options.ShowLabelMin;}
     set{_options.ShowLabelMin=value; }
   }

   public bool ShowLabelAvr 
   {
     get{ return _options.ShowLabelAvr;}
     set{ _options.ShowLabelAvr = value; }
   }

   public void Reset()
   {
      _options = new AllOptionsBackstage(); // will reset all your options to default
   }
}