0

我有一个包含几个自定义表单元素的表单类。

我有一个实体对象,它为元素提供特定属性,这些是从 XML 文件中解析的。所有元素都将实体作为其构造函数中的参数,但之后在其构造函数中需要不同的参数。

对于元素创建,我目前使用如下 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;
        }

有没有人对此有想法和/或想法?

4

2 回答 2

0

是否需要在构造函数上传递参数?如果不是,我建议通过命名约定(如您的情况表明这是可能的)创建对象,然后始终使用约定,通过反射设置每个属性。由于您在 XML 中拥有的值始终是一个字符串,您可能希望将它在 Convert.ChangeType() 中传递给目标属性类型以进行正常的工作分配。

于 2011-12-22T14:14:28.200 回答
0

与其将所有东西都注入到实体的 ctor 中,不如使用命令模式双重调度模式 来管理它。

与其将实体作为 ctor 参数传递,不如将其设为属性,或者仅传递所需的属性。

new FormCheckBox
{
   Height = BaseElementHeight,
   Number = entity.Number, 
   Text = entity.Text 
   ...
};

这使实体完全脱离 UI。

于 2011-12-22T13:32:10.380 回答