You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于枚举标志(Enum Flag)通过构造函数创建对象的技术咨询

完善基于Enum Flag的工作流实例化与操作逻辑

首先得补上你代码里缺失的WorkflowFlag枚举定义——既然是枚举标志(Enum Flags),一定要加上[Flags]特性,这样才能支持多个标志的组合使用:

[Flags]
public enum WorkflowFlag
{
    None = 0,
    One = 1 << 0, // 对应二进制001
    Two = 1 << 1, // 对应二进制010
    Three = 1 << 2 // 示例扩展,对应二进制100
}

接下来,我会用工厂模式优化你的实例化逻辑(避免冗长的if-else),同时通过定义统一接口来简化后续的对象操作。

第一步:定义统一的工作流接口

为了让不同的工作流对象能被统一处理,咱们先搞个IWorkflow接口,把所有工作流的通用操作抽象出来:

public interface IWorkflow
{
    void Execute(); // 这个方法用来封装工作流的核心操作,后续统一调用
}

然后让你的WorkflowOne和新增的WorkflowTwo都实现这个接口:

public class WorkflowOne : IWorkflow
{
    public int Count { get; set; }

    public WorkflowOne(int count)
    {
        Count = count;
        // 这里放你的构造初始化逻辑
    }

    public void Execute()
    {
        Console.WriteLine($"WorkflowOne执行,当前Count:{Count}");
        // 写WorkflowOne的具体业务逻辑
    }
}

public class WorkflowTwo : IWorkflow
{
    public string TaskName { get; set; }

    public WorkflowTwo(string taskName)
    {
        TaskName = taskName;
        // 这里放WorkflowTwo的构造初始化逻辑
    }

    public void Execute()
    {
        Console.WriteLine($"WorkflowTwo执行,当前任务名称:{TaskName}");
        // 写WorkflowTwo的具体业务逻辑
    }
}

第二步:用工厂类处理实例化逻辑

把根据枚举标志创建对象的逻辑抽成一个静态工厂类,这样代码更干净,后续加新工作流也方便:

public static class WorkflowFactory
{
    public static List<IWorkflow> CreateWorkflows(WorkflowFlag flags)
    {
        var workflows = new List<IWorkflow>();

        // 用位运算判断是否包含某个标志(这是Enum Flags的标准用法)
        if ((flags & WorkflowFlag.One) != WorkflowFlag.None)
        {
            workflows.Add(new WorkflowOne(10)); // 这里的参数可以根据实际需求传,比如从配置读
        }

        if ((flags & WorkflowFlag.Two) != WorkflowFlag.None)
        {
            workflows.Add(new WorkflowTwo("用户注册流程"));
        }

        // 以后加新的WorkflowThree?直接在这里加个判断就行,不用改其他逻辑
        if ((flags & WorkflowFlag.Three) != WorkflowFlag.None)
        {
            // workflows.Add(new WorkflowThree(xxx));
        }

        return workflows;
    }
}

第三步:在Main方法中使用并完成后续操作

现在Main方法的逻辑会变得非常简洁,而且支持同时创建多个工作流(比如传入WorkflowFlag.One | WorkflowFlag.Two就能同时创建两个对象):

public class Program
{
    static void Main(string[] args)
    {
        // 示例1:只创建WorkflowOne
        var workflowBasic = new WorkflowBasic(WorkflowFlag.One);
        var workflows = WorkflowFactory.CreateWorkflows(workflowBasic.Flag);

        // 示例2:同时创建WorkflowOne和WorkflowTwo(组合标志)
        // var workflowBasic = new WorkflowBasic(WorkflowFlag.One | WorkflowFlag.Two);
        // var workflows = WorkflowFactory.CreateWorkflows(workflowBasic.Flag);

        // 统一执行所有工作流的操作
        foreach (var workflow in workflows)
        {
            workflow.Execute();

            // 如果需要针对特定工作流做特殊操作,直接类型转换就行
            if (workflow is WorkflowOne oneFlow)
            {
                oneFlow.Count += 5;
                Console.WriteLine($"WorkflowOne的Count更新为:{oneFlow.Count}");
            }
        }
    }
}

// 补充你代码里的WorkflowBasic类
public class WorkflowBasic
{
    public WorkflowFlag Flag { get; }

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

为啥要这么写?

  • 扩展性拉满:以后加新的工作流类型,只需要加枚举值、实现接口、工厂类里加一行判断,完全不用动Main方法的逻辑。
  • 代码更干净:把实例化逻辑抽出去,Main方法只负责调用和业务操作,符合单一职责。
  • 支持多标志组合:用位运算判断标志,完美适配Enum Flags的特性,能同时创建多个工作流对象。
  • 统一操作:通过接口,所有工作流的通用操作可以统一处理,不用写一堆if-else判断类型。

如果你的场景里只需要单个标志(不需要组合),也可以把工厂方法改成返回单个IWorkflow对象,不过上面的实现更通用哦。

内容的提问来源于stack exchange,提问作者mskuratowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:05