首页 > 解决方案 > 使用基于枚举标志的构造器创建对象

问题描述

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

这是示例代码:

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);
    }

如果有不清楚的地方,请告诉我。

标签: c#.netreflection

解决方案


您描述的要求是一种称为“抽象工厂”的设计模式。您将枚举提供给抽象工厂,它会返回相关的工作流对象。

您可能会发现您的工作流程是“策略”设计模式的一个案例。我建议他们都应该实现一个通用接口。

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

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


推荐阅读