使用基于枚举标志的构造函数创建对象

时间:2018-04-29 06:30:40

标签: c# .net reflection

我想基于枚举标志创建一个对象。

以下是示例代码:

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。它应该创建WorkflowTwo。

此外,我只想创建一个变量,所以我不想创建某种:

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

如果不清楚,请告诉我。

1 个答案:

答案 0 :(得分:2)

您所描述的要求称为"abstract factory" design pattern。您可以将枚举提供给抽象工厂,它会返回相关的工作流对象。

您可能会发现您的工作流程属于"strategy" design pattern。我建议他们都应该实现一个通用接口。

有很多方法可以实现这一点。一个示例是创建具有枚举值作为参数的属性。使用相关枚举将此属性附加到每个工作流类。然后,抽象工厂可以使用反射来查找实现工作流界面的类,并且还具有包含所需枚举值的属性。

我建议添加单元测试以确保每个枚举值都有一个实现。