需要帮助替换 C# 中的开关

问题描述 投票:0回答:1

我在 .NET6 中有一个控制台应用程序,它接收 1 个参数,并基于此来决定将执行哪个操作。起初,我将所有执行都作为静态方法,并且所有内容都在 switch 语句中决定,但随后重构了操作执行。

但现在我仍在尝试找出如何删除 switch 语句,以便让一切变得更加动态,并且不用担心每次开发新操作时添加新案例。

基本上试图达成一个解决方案(至少是一个“好的”方法),开发人员应该只担心操作类本身的编码,而不是去切换(程序应该知道什么与什么相关 -> 参数-行动)

目前主要代码如下:

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //validating args
            if(!args.Any())
                return;

            switch (args.First())
            {
                case "action1":
                case "action2":
                case "action3":
                    break;
                default:
                    return;
            }

            switch (args.First())
            {
                case "action1":
                    RunTheAction<Action1>();
                    break;
                case "action2":
                    RunTheAction<Action2>();
                    break;
                case "action3":
                    //todo RunTheAction<Action3>()
                    break;
                //it keeps growing -> RunTheAction<>()
            }
        }

        static void RunTheAction<T>() where T : IAction
        {
            var action = Activator.CreateInstance<T>();
            action.Execute();
        }
    }
}

所有要执行的action实例都使用IAction接口:

    internal interface IAction
    {
        void Execute();
    }

    internal class Action1 : IAction
    {
        public void Execute()
        {
            //do some action1 stuff
        }
    }

    internal class Action2 : IAction
    {
        public void Execute()
        {
            //do some action2 stuff (different than action1 :) )
        }
    }

与动作的恒定字符串关系

c# .net design-patterns .net-6.0
1个回答
0
投票

不要重新发明轮子。 CommandlineUtils 是一个很棒的库,可以做你想要的事情,并且有大量的文档。它允许您定义命令层次结构并处理解析参数,以便您可以根据需要将数据传递给各个命令。与依赖项注入和日志记录配合使用,以便您可以构建专业的控制台应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.