在不使用DTO的情况下使用.NET Activator.CreateInstance

时间:2011-12-22 13:27:17

标签: .net dto activator createinstance

我有一个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;
        }

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

2 个答案:

答案 0 :(得分:0)

而不是将所有内容注入实体的ctor,为什么不使用command patterndouble dispatch pattern 管理这个。

不是将实体作为ctor参数传递,而是将其作为属性,或者只传递所需的属性。

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

这使实体完全脱离了用户界面。

答案 1 :(得分:0)

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