【问题标题】:Parse commandline args and execute methods解析命令行参数并执行方法
【发布时间】:2020-11-27 18:34:57
【问题描述】:

我有一个控制台应用程序,将几十个参数作为输入。 我正在使用 commandlineparser 来帮助自己,我在设置属性值时没有问题。

顺便说一句,我还有很多方法需要回忆。
我需要调用的方法将 0 到 7 之间的任意数量的参数作为输入;有些方法是无参数的,大多数方法至少需要 3 个参数作为输入。

寻找最简单情况的解决方案(无参数方法)我想出了这个解决方案: 我引入了一个名为IsExecuteOperation的新布尔属性,我设置了这个属性,让命令行解析器完成它的工作,然后检查值并最终调用方法像这样:

    class Program
    {
        static void Main( string[] args )
        {
            Parser.Default.ParseArguments<Options>( args )
                .WithParsed<Options>( o =>
                {
                    if( o.IsExecuteOperation )
                    {
                        o.ExecuteOperation();
                    }
                } );
        }
    
        public class Options
        {
            public bool IsExecuteOperation { get; set; }
    
            public void ExecuteOperation()
            {
                //...
            }
        }
    }

这看起来是个好主意,所以我采用了所有其他无参数方法。
无参数方法有 7 个,所以我有 7 个选项要处理,以及检查此标志和调用方法的附加代码。

我开始处理将 1 个参数作为输入的方法(2 个方法)。

第一个方法将一个数字作为输入:这会产生 2 个新属性(1 个用于方法参数 + 1 个用于指示是否执行方法的属性)+ 用于检查和执行方法本身的附加代码。

第二个单参数方法出现了问题:它将一个对象作为输入,该对象在内部定义了至少 9 个属性,我绝对需要设置这些属性才能正确执行该方法。

好吧,我也可以介绍这 9 个属性,但此时我才意识到,将相同的方法应用于我的所有方法 (50ish) 和引入数百个属性只是为了调用这些方法。

我的问题..我的方法正确吗? 有没有更好的策略来解决这个问题? 有没有办法直接调用方法?

谢谢。

【问题讨论】:

  • 是否会根据您的需要为每个方法创建一个选项类,每个选项类都装饰有Verb 属性?
  • 嗯,你能更好地解释一下它对我有什么帮助吗?谢谢
  • 这取决于所需命令行的外观。如果是“myprg method1 [args1]”、“myprg method2 [args2]”等,请使用Verbs 功能。
  • @KlausGütter 动词肯定会有所帮助。

标签: c# .net methods command-line command-line-parser


【解决方案1】:

UltraMapper.CommandLine 完全符合您的要求!

它允许您直接从命令行调用方法传递任意数量的输入参数。

支持primitivecomplex types作为参数; Collections 作为 IEnumerableListarrays 也受支持。

它允许您通过摆脱所有“命令行标志”和调度代码来大幅减少处理命令行参数所需的代码量。

public class Program
{
    static void Main( string[] args )
    {
        CommandLine.Instance.Parse<Commands>( args );
        //just call with this args: --method1 ["my string" "mysecondstring" "etc"]
    }

    public class Commands
    {
        public void Method1( List<string> strings ) {  ///...  }
        public void Method2( SomeClass myParam, List<SomeOtherClass> mySecondParam ) {  ///...  }
    }
}

我在 github 上发布了 UltraMapper.CommandLine 作为开源项目。
看看吧,它可能对你的下一个项目有帮助!

还有可用的 nuget 包here

【讨论】:

  • 完美!干得好!
猜你喜欢
  • 2013-06-04
  • 2011-12-15
  • 2013-03-21
  • 2012-01-26
  • 2011-08-15
相关资源
最近更新 更多