Как динамически создавать объекты из классов с немного разными конструкторами - PullRequest
1 голос
/ 07 ноября 2011

Я работаю над приложением WinForms.

У меня есть группа классов тестов, каждый класс выполняет разные вещи, но 80% классов используют почти идентичные конструкторы.Я использую рефлексию для динамического создания экземпляров классов во время выполнения из List, там могут быть десятки тестов одного и того же типа.

currentTest = (ISystemTest)Activator.CreateInstance(classtype,
                                                    gui,
                                                    param1,
                                                    param2,
                                                    param3,
                                                    param4,
                                                    currentProgressUpdater);

, а затем запустить экземпляр через Action.

Как я уже сказал, некоторые конструкторы имеют немного другую подпись.Раньше я работал с операторами switch, но с помощью отражения становится проще поддерживать.

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

Поэтому, если у вас есть творческое решение этой проблемы, я бы хотел услышать ее.

Пример конструкторов:

  • ClassName(gui, param1, param2, param3, progressUpdater) => около 80% текущих испытаний

  • ClassName(gui, param1,param4, param5) => около 10% текущих испытаний

  • ClassName(param4, param6) =>10% текущих тестов

типы - это пользовательские классы, а не строки или целые числа

Ответы [ 3 ]

5 голосов
/ 07 ноября 2011

Проблема, которую вы описываете, обычно решается с помощью внедрения зависимости . Вы можете использовать инфраструктуру внедрения зависимостей, такую ​​как Managed Extensibility Framework .

edit: Вы можете найти некоторые примеры использования MEF для DI здесь и здесь . Другие структуры DI ( unity , autofac , Ninject ) работают аналогично. Я сам работал как с MEF, так и с autofac, и, хотя для начала работы с этими концепциями нужно немного учиться, они быстро становятся интуитивно понятными и действительно полезными. Autofac представлен как захватывающий IoC контейнер, и это действительно DI вызывает привыкание, независимо от того, какую платформу вы используете.

0 голосов
/ 07 ноября 2011

У активатора нет реального способа определить, какие параметры вводить где, в разных конструкторах. Вы тоже этого не хотите, так как можете довольно быстро сжечь пальцы.

Тем не менее, вы можете использовать инфраструктуру внедрения зависимостей, такую ​​как MEF или Unity, или все, что вы предпочитаете делать большую часть внедрения для вас. это позволяет вам взять контроль там, где это необходимо.

Другим вариантом будет работа с классом установки, который содержит общие свойства, а не конструктор со многими аргументами.

** РЕДАКТИРОВАТЬ ** прикрепленный пример кода для класса настроек

class ConsumerSettings
{
    public string Property1 { get; set; }

    public string Property2 { get; set; }
}

class Consumer1
{
    public Consumer1(ConsumerSettings settings)
    {
        if (settings.Property1 == "foo")
        {
        }
    }
}

class Consumer2
{
    public Consumer2(ConsumerSettings settings)
    {
        if (settings.Property2 == "bar")
        {
        }
    }
}
0 голосов
/ 07 ноября 2011

Вы можете предоставить метаданные, которые показывают, какие параметры требуются для теста.Например, вы можете объявить атрибут, который определяет набор параметров:

[Flags]
public enum TestParams { Param1 = 1, Param2 = 2, Param3 = 4, All = Param1 | Param2 | Param3 };
public class ParamsAttribute : Attribute {
    readonly TestParams params;
    public ParamsAttrbiute (TestParams params) {
        this.params = params;
    }
    public TestParams Params { get { return params; } }
} 

Проверьте значение свойства ParamsAttribute и Params в вашем активаторе и предоставьте только необходимые аргументы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...