Создать объект с помощью конструктора на основе флага enum - PullRequest
0 голосов
/ 29 апреля 2018

Я хотел бы создать объект на основе флага enum.

Вот пример кода:

public class Program
{
    static void Main(string[] args)
    {
        var workflowBasic = new WorkflowBasic(WorkflowFlag.One);

        if (workflowBasic.Flag == WorkflowFlag.One)
        {
            // create WorkflowOne workflow 
        }
        else if (workflowBasic.Flag == WorkflowFlag.Two)
        {
            // create WorkflowTwo workflow
        }

        // TODO: rest action on created variable
    }
}

public class WorkflowOne
{
    public int Count { get; set; }
    public WorkflowOne(int count)
    {
        Count = count;
    }
}

public class WorkflowTwo
{
    public int Count { get; set; }
    public WorkflowTwo(int count)
    {
        Count = count;
    }
}

public class WorkflowBasic
{
    public WorkflowFlag Flag { get; set; }

    public WorkflowBasic(WorkflowFlag flag)
    {
        Flag = flag;
    }
}

public enum WorkflowFlag
{
    One = 1,
    Two = 2
}

Так что для WorkflowFlag.One он должен создать объект WorkflowOne, а для WorkflowFlag.Two он должен создать WorkflowTwo.

Более того, я хотел бы создать только одну переменную, поэтому я не хочу создавать что-то вроде:

    if (workflowBasic.Flag == WorkflowFlag.One)
    {
        var objectTest = new WorkflowOne(1);
    }
    else if (workflowBasic.Flag == WorkflowFlag.Two)
    {
        var objectTest = new WorkflowTwo(2);
    }

Если что-то неясно, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 29 апреля 2018

Описываемое вами требование известно как шаблон проектирования "абстрактной фабрики" . Вы передаете перечисление абстрактной фабрике, и оно возвращает вам соответствующий объект рабочего процесса.

Вы можете обнаружить, что ваш рабочий процесс соответствует шаблону «стратегия» проектирования . Я бы посоветовал им всем реализовать общий интерфейс.

Есть много способов реализовать это. Одним из примеров может быть создание атрибута, который имеет значение перечисления в качестве параметра. Прикрепите этот атрибут к каждому из ваших классов рабочего процесса с соответствующим перечислением. Затем абстрактная фабрика может использовать отражение, чтобы найти класс, который реализует интерфейс рабочего процесса, а также имеет атрибут с требуемым значением перечисления.

И я бы предложил добавить модульные тесты, чтобы гарантировать реализацию каждого значения перечисления.

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