最近測試工作做的比較多因此時常要創建一些控制台類型的應用程序。因為程序有不同的參數開關,需要在程序啟動的時候通過命令行來給程序傳遞各種開關和參數。直接操作args有些不方便,所以就寫了個解析參數的小工具來處理各種參數。
參數實體:
1 public class CommandLineArgument 2 { 3 List<CommandLineArgument> _arguments; 4 5 int _index; 6 7 string _argumentText; 8 9 public CommandLineArgument Next 10 { 11 get { 12 if (_index < _arguments.Count - 1) { 13 return _arguments[_index + 1]; 14 } 15 16 return null; 17 } 18 } 19 public CommandLineArgument Previous 20 { 21 get { 22 if (_index > 0) 23 { 24 return _arguments[_index - 1]; 25 } 26 27 return null; 28 } 29 } 30 internal CommandLineArgument(List<CommandLineArgument> args, int index, string argument) 31 { 32 _arguments = args; 33 _index = index; 34 _argumentText = argument; 35 } 36 37 public CommandLineArgument Take() { 38 return Next; 39 } 40 41 public IEnumerable<CommandLineArgument> Take(int count) 42 { 43 var list = new List<CommandLineArgument>(); 44 var parent = this; 45 for (int i = 0; i < count; i++) 46 { 47 var next = parent.Next; 48 if (next == null) 49 break; 50 51 list.Add(next); 52 53 parent = next; 54 } 55 56 return list; 57 } 58 59 public static implicit operator string(CommandLineArgument argument) 60 { 61 return argument._argumentText; 62 } 63 64 public override string ToString() 65 { 66 return _argumentText; 67 } 68 }
參數解析器:
1 public class CommandLineArgumentParser 2 { 3 4 List<CommandLineArgument> _arguments; 5 public static CommandLineArgumentParser Parse(string[] args) { 6 return new CommandLineArgumentParser(args); 7 } 8 9 public CommandLineArgumentParser(string[] args) 10 { 11 _arguments = new List<CommandLineArgument>(); 12 13 for (int i = 0; i < args.Length; i++) 14 { 15 _arguments.Add(new CommandLineArgument(_arguments,i,args[i])); 16 } 17 18 } 19 20 public CommandLineArgument Get(string argumentName) 21 { 22 return _arguments.FirstOrDefault(p => p == argumentName); 23 } 24 25 public bool Has(string argumentName) { 26 return _arguments.Count(p=>p==argumentName)>0; 27 } 28 }
在項目中引入這兩個類就可以在Main函數裡對args做相應的解析和操作了。
例如有控制台應用Example,在命令行中輸入:
Example.exe -u MrJson -p admin123
在Example的Main函數裡處理args:
1 static void Main(string[] args) 2 { 3 var arguments = CommandLineArgumentParser.Parse(args); 4 5 if (arguments.Has("-u")) 6 { 7 Console.WriteLine("用戶名:{0}", arguments.Get("-u").Next); 8 } 9 10 if (arguments.Has("-p")) 11 { 12 Console.WriteLine("密碼:{0}", arguments.Get("-p").Next); 13 } 14 }
如果參數後面要傳多個值,例如下面這個例子,-chpwd參數需要兩個參數:
Example.exe -chpwd admin888 admin999
那麼,就可以這樣處理:
1 if(arguments.Has("-chpwd")) 2 { 3 var arg = arguments.Get("-chpwd"); 4 var oldPwd = arg.Take(); 5 var newPwd = arg.Take().Take(); 6 // 或者 7 var pwds = arg.Take(2); 8 oldPwd = pwds.First(); 9 newPwd = pwds.Last(); 10 11 Console.WriteLine("原密碼:{0} 新密碼:{1}", oldPwd, newPwd); 12 }
That's all.