我有一个简单的类,用于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()
方法中。但有没有更智能的方法来实现这一目标?
答案 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
}
}