private static void Run() { while (true) { var consoleInput = ReadFromConsole(); if (string.IsNullOrWhiteSpace(consoleInput)) { continue; } try { var cmd = new ConsoleCommand(consoleInput); var result = Execute(cmd); WriteToConsole(result); } catch (Exception ex) { WriteToConsole(ex.Message); } } }
private static string Execute(ConsoleCommand command) { if (!_commandLibraries.ContainsKey(command.LibraryClassName)) { return("No such command-library found"); } var methodDictionary = _commandLibraries[command.LibraryClassName]; if (!methodDictionary.ContainsKey(command.Name)) { return("No such command-name found"); } var methodParameterValueList = new List <object>(); IEnumerable <ParameterInfo> parameterInfoList = methodDictionary[command.Name].ToList(); var requiredParams = parameterInfoList.Where(p => p.IsOptional == false); var optionalParams = parameterInfoList.Where(p => p.IsOptional); var requiredCount = requiredParams.Count(); var optionalCount = optionalParams.Count(); var providedCount = command.Arguments.Count(); if (requiredCount > providedCount) { if (requiredCount > providedCount) { return ($"Missing required argument. {requiredCount} required, {optionalCount} optional, {providedCount} provided"); } } if (parameterInfoList.Count() > 0) { foreach (var parameterInfo in parameterInfoList) { methodParameterValueList.Add(parameterInfo.DefaultValue); } } for (var i = 0; i < command.Arguments.Count(); i++) { var methodParam = parameterInfoList.ElementAt(i); var typeRequired = methodParam.ParameterType; try { var value = CoerceArgument(typeRequired, command.Arguments.ElementAt(i)); methodParameterValueList.RemoveAt(i); methodParameterValueList.Insert(i, value); } catch (ArgumentException) { var argumentName = methodParam.Name; var argumentTypeName = typeRequired.Name; string message = $"The value passed for argument '{argumentName}' cannot be parsed to type '{argumentTypeName}'"; throw new ArgumentException(message); } } var currentAssembly = typeof(Program).Assembly; var commmandLibraryClass = currentAssembly.GetType(CommandNameSpace + "." + command.LibraryClassName); object[] inputArguments = null; if (methodParameterValueList.Count > 0) { inputArguments = methodParameterValueList.ToArray(); } var typeInfo = commmandLibraryClass; try { var result = typeInfo.InvokeMember(command.Name, BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, inputArguments); return(result.ToString()); } catch (TargetInvocationException ex) { throw ex.InnerException; } }