Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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;
            }
        }