private void processMethod(MethodBase method, CommandAttribute attr) { if (!method.IsStatic) { if (method.DeclaringType is not null) { throw new Exception(method.DeclaringType.Name + "." + method.Name + " is marked as a command but is not static"); } } else { var info = new CommandInfo(); var parameters = method.GetParameters(); var defaults = new object[parameters.Length]; var usage = new string[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { var p = parameters[i]; usage[i] = p.Name + " : "; //usage[i] += p.ParameterType.ToString().Split('.').Last(); if (p.ParameterType == typeof(string)) { usage[i] += "string"; } else if (p.ParameterType == typeof(int)) { usage[i] += "int"; } else if (p.ParameterType == typeof(decimal)) { usage[i] += "decimal"; } else if (p.ParameterType == typeof(bool)) { usage[i] += "bool"; } else if (Enums.Values.Contains(p.ParameterType)) { usage[i] += p.ParameterType.ToString().Split('.').Last(); } else if (method.DeclaringType is not null) { throw new Exception(method.DeclaringType.Name + "." + method.Name + " is marked as a command, but has an invalid parameter type. Allowed types are: string, int, decimal, bool and enums"); } // no System.DBNull in PCL so we fake it if (p.DefaultValue != null && p.DefaultValue.GetType().FullName == "System.DBNull") { defaults[i] = null; } else if (p.DefaultValue != null) { defaults[i] = p.DefaultValue; if (p.ParameterType == typeof(string)) { usage[i] += "=\"" + p.DefaultValue.ToString() + "\""; } else { usage[i] += "=" + p.DefaultValue.ToString(); } } else { defaults[i] = null; } } if (usage.Length == 0) { info.Usage = ""; } else { info.Usage = "[" + string.Join(" | ", usage) + "]"; } info.Help = attr.Help; info.Action = args => { if (parameters.Length == 0) { method.Invoke(null, null); } else { var param = (object[])defaults.Clone(); for (var i = 0; i < param.Length && i < args.Length; i++) { if (parameters[i].ParameterType == typeof(string)) { param[i] = argString(args[i]); } else if (parameters[i].ParameterType == typeof(int)) { param[i] = argInt(args[i]); } else if (parameters[i].ParameterType == typeof(decimal)) { param[i] = argDecimal(args[i]); } else if (parameters[i].ParameterType == typeof(bool)) { param[i] = argBool(args[i]); } else if (Enums.ContainsValue(parameters[i].ParameterType)) { param[i] = Enum.Parse(parameters[i].ParameterType, args[i]); } } try { method.Invoke(null, param); } catch (Exception e) { LoggerService.LogError(e); } } }; Commands[attr.Name] = info; LoggerService.LogTrace($"Command Added: {attr.Name}"); } }