Использование .NET Activator.CreateInstance без использования DTO - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть класс 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 голосов
/ 22 декабря 2011

Нужно ли передавать параметр в конструктор?Если нет, я бы предложил создать объект по соглашению об именах (как показано в вашем случае, что возможно), а затем, используя всегда соглашение, с помощью отражения задайте каждое свойство.Поскольку значение, которое вы имеете в XML, всегда является строкой, вы, вероятно, захотите передать его в Convert.ChangeType () целевому типу свойства, чтобы получить изящное рабочее назначение.

0 голосов
/ 22 декабря 2011

вместо того, чтобы вводить каждую вещь в ctor объекта, почему бы не использовать шаблон команды или шаблон двойной отправки чтобы справиться с этим.

Вместо передачи сущности в качестве аргумента ctor, сделайте его свойством или просто передайте необходимые свойства.

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

Это полностью исключает сущность из пользовательского интерфейса.

...