我有一个Form类,其中包含多个自定义表单元素。
我有一个Entity对象,它为元素提供特定的属性,这些属性是从XML文件中解析出来的。所有元素都将Entity作为构造函数中的参数,但之后在构造函数中需要不同的参数。
对于元素创建,我目前使用如下的switch语句。但是,我想将其转换为使用Activator.CreateInstance。但是,使用构造函数中的不同参数,我知道处理此问题的唯一方法是创建包含所有参数的DTO,在构造函数中传递它,然后让每个构造函数请求它需要的任何信息。我想要一个替代方案,因为我的理解是DTO在现代的实践中不受欢迎。
switch (entity.GetPropertyValue("Class"))
{
case "FormCheckBox":
newElement = new FormCheckBox(entity, BaseElementHeight);
break;
case "RowSeparator":
newElement = new RowSeperator(entity, RowHeight, _mainCanvas);
break;
case "FormLabel":
newElement = new FormLabel(entity, BaseElementHeight);
break;
case "FormEditBox":
newElement = new FormEditBox(entity, _mainCanvas);//, BaseElementHeight, 600);
break;
case "FormComboBox":
newElement = new FormComboBox(entity, BaseElementHeight);
break;
case "FormTextBox":
newElement = new FormTextBox(entity, BaseElementHeight, TextFontSize, MaxFontBoxSize);
break;
default:
return null;
}
有没有人对此有想法和/或想法?
答案 0 :(得分:0)
而不是将所有内容注入实体的ctor,为什么不使用command pattern或 double dispatch pattern 管理这个。
不是将实体作为ctor参数传递,而是将其作为属性,或者只传递所需的属性。
new FormCheckBox
{
Height = BaseElementHeight,
Number = entity.Number,
Text = entity.Text
...
};
这使实体完全脱离了用户界面。
答案 1 :(得分:0)
是否有必要在构造函数上传递参数?如果不是,我建议通过命名约定创建对象(如您的情况所示),然后,通过使用始终约定,通过反射设置每个属性。由于XML中的值始终是一个字符串,因此您可能希望将它在Convert.ChangeType()中传递给目标属性类型,以便进行正常的工作分配。