using System; using System.Linq; using System.Reflection; namespace Plate; class Flag : Attribute { public string longName; public string shortname; public Flag(string longName, string shortname) { this.longName = longName; this.shortname = shortname; System.Console.WriteLine($"--{longName} -{shortname}"); } } class Command : Attribute {} class CommandMethod : Attribute {} [Command] class TestClass { [CommandMethod] [Flag("verbose", "v")] public void help() { } } class ArgParser { private readonly string[] args; public ArgParser(string[] args) { // Match these args with the commands and their flags this.args = args; // Find all the commands via Command attribute var commands = from t in Assembly.GetExecutingAssembly().GetTypes() where t.GetCustomAttributes(false).Any(a => a is Command) select t; foreach (Type t in commands) { var commandMethods = from m in t.GetMethods() where m.GetCustomAttributes(false).Any(a => a is CommandMethod) select m; var flags = from m in t.GetMethods() where m.GetCustomAttributes(false).Any(a => a is Flag && a is CommandMethod) select m; var instance = Activator.CreateInstance(t); foreach (MethodInfo mInfo in commandMethods) { foreach (MethodInfo wFlag in flags) { if(wFlag.Name == mInfo.Name){ System.Console.WriteLine("Flags: "); } } mInfo.Invoke(instance, new object[0]); } } } }