private static Menu GetMenu(DebugMenuAttribute item, out string name) { if (string.IsNullOrEmpty(item.Path)) { name = null; return(_rootMenu); } else { string[] menus = item.Path.Split('/'); Menu menu = _rootMenu; for (int i = 0; i < menus.Length - 1; i++) { menu = FindOrAddMenu(menu, menus[i]); } name = menus[menus.Length - 1]; return(menu); } }
private static void AddField(DebugMenuAttribute item, FieldInfo field) { Menu menu = GetMenu(item, out string name); menu._items.Add(new MenuItemField(string.IsNullOrEmpty(name) ? field.Name : name, field)); }
private static void AddProperty(DebugMenuAttribute item, PropertyInfo property) { Menu menu = GetMenu(item, out string name); menu._items.Add(new MenuItemProperty(string.IsNullOrEmpty(name) ? property.Name : name, property)); }
private static void AddFunction(DebugMenuAttribute item, MethodInfo method) { Menu menu = GetMenu(item, out string name); menu._items.Add(new MenuItemFunction(string.IsNullOrEmpty(name) ? method.Name : name, method)); }
private static void BuildMenus() { _rootMenu = new Menu("Debug Menu"); _rootMenu._items.Add(new MenuItemExit()); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { if (assemblies[i].ReflectionOnly) { continue; } Type[] types = null; try { types = assemblies[i].GetTypes(); } catch { continue; } foreach (Type type in types) { //Check all methods for static paramterless functions marked with attribute MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo method in methods) { if (method.GetParameters().Length == 0) { DebugMenuAttribute item = SystemUtils.GetAttribute <DebugMenuAttribute>(method); if (item != null) { AddFunction(item, method); } } } PropertyInfo[] properties = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (PropertyInfo property in properties) { DebugMenuAttribute item = SystemUtils.GetAttribute <DebugMenuAttribute>(property); if (item != null) { AddProperty(item, property); } } FieldInfo[] fields = type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo field in fields) { DebugMenuAttribute item = SystemUtils.GetAttribute <DebugMenuAttribute>(field); if (item != null) { AddField(item, field); } } } } }