private static MonoMenuItem[] ExtractContextMenu(System.Type type) { Dictionary <string, MonoMenuItem> dictionary = new Dictionary <string, MonoMenuItem>(); MethodInfo[] methods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); for (int i = 0; i < methods.GetLength(0); i++) { MethodInfo mi = methods[i]; object[] customAttributes = mi.GetCustomAttributes(typeof(ContextMenu), false); foreach (ContextMenu menu in customAttributes) { MonoMenuItem item = !dictionary.ContainsKey(menu.menuItem) ? new MonoMenuItem() : dictionary[menu.menuItem]; if (!ValidateMethodForMenuCommand(mi, true)) { break; } item.menuItem = menu.menuItem; if (menu.validate) { item.validateType = type; item.validateMethod = mi; item.validateName = mi.Name; } else { item.index = i; item.priority = menu.priority; item.executeType = type; item.executeMethod = mi; item.executeName = mi.Name; } dictionary[menu.menuItem] = item; } } MonoMenuItem[] array = dictionary.Values.ToArray <MonoMenuItem>(); Array.Sort(array, new CompareMenuIndex()); return(array); }
private static MonoMenuItem[] ExtractMenuCommands(Assembly assembly, bool modifiedSinceLastReload) { BindingFlags bindingAttr = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static; if (modifiedSinceLastReload) { bindingAttr |= BindingFlags.Instance; } bool @bool = EditorPrefs.GetBool("InternalMode", false); Dictionary <string, MonoMenuItem> dictionary = new Dictionary <string, MonoMenuItem>(); System.Type[] typesFromAssembly = AssemblyHelper.GetTypesFromAssembly(assembly); foreach (System.Type type in typesFromAssembly) { MethodInfo[] methods = type.GetMethods(bindingAttr); for (int i = 0; i < methods.GetLength(0); i++) { MethodInfo mi = methods[i]; object[] customAttributes = mi.GetCustomAttributes(typeof(UnityEditor.MenuItem), false); if ((customAttributes.Length > 0) && type.IsGenericTypeDefinition) { object[] args = new object[] { type.Name, mi.Name }; UnityEngine.Debug.LogWarningFormat("Method {0}.{1} cannot be used for menu commands because class {0} is an open generic type.", args); } else { foreach (UnityEditor.MenuItem item in customAttributes) { MonoMenuItem item2 = !dictionary.ContainsKey(item.menuItem) ? new MonoMenuItem() : dictionary[item.menuItem]; if (!ValidateMethodForMenuCommand(mi, false)) { break; } if (item.menuItem.StartsWith("internal:", StringComparison.Ordinal)) { if (!@bool) { continue; } item2.menuItem = item.menuItem.Substring(9); } else { item2.menuItem = item.menuItem; } if (item.validate) { item2.validateType = type; item2.validateMethod = mi; item2.validateName = mi.Name; } else { item2.index = i; item2.priority = item.priority; item2.executeType = type; item2.executeMethod = mi; item2.executeName = mi.Name; } dictionary[item.menuItem] = item2; } } } } MonoMenuItem[] array = dictionary.Values.ToArray <MonoMenuItem>(); Array.Sort(array, new CompareMenuIndex()); return(array); }