using System; using System.Collections.Generic; using System.Runtime.Serialization; #if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER using UnityEditor; #else using System.Reflection; #endif namespace Module.NavigationTool.Editor.Toolbar { internal static class ToolbarSettingsUtility { public static IToolbarSettings[] GetAllUserSettings() { var list = new List(8); try { #if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER var types = TypeCache.GetTypesDerivedFrom(); for (var i = 0; i < types.Count; i++) { Type type = types[i]; if (type.IsInterface || type.IsAbstract) continue; var toolbar = (IToolbarSettings)FormatterServices.GetUninitializedObject(type); toolbar.Initialize(); list.Add(toolbar); } #else Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Type iType = typeof(IToolbarSettings); for (var i = 0; i < assemblies.Length; i++) { Assembly assembly = assemblies[i]; Type[] types = assembly.GetTypes(); for (var j = 0; j < types.Length; j++) { Type type = types[j]; if (type.IsInterface || type.IsAbstract || !iType.IsAssignableFrom(type)) continue; var toolbar = (IToolbarSettings)FormatterServices.GetUninitializedObject(type); toolbar.Initialize(); list.Add(toolbar); } } #endif list.Sort((s0, s1) => string.Compare(s0.Title, s1.Title, StringComparison.Ordinal)); } catch (Exception) { // Fail silently } return list.ToArray(); } public static IToolbarProjectSettings[] GetAllProjectSettings(ToolbarProjectSettings settings) { var list = new List(8); try { #if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER var types = TypeCache.GetTypesDerivedFrom(); for (var i = 0; i < types.Count; i++) { Type type = types[i]; if (type.IsInterface || type.IsAbstract) continue; var toolbar = (IToolbarProjectSettings)FormatterServices.GetUninitializedObject(type); toolbar.Initialize(settings); list.Add(toolbar); } #else Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Type iType = typeof(IToolbarProjectSettings); for (var i = 0; i < assemblies.Length; i++) { Assembly assembly = assemblies[i]; Type[] types = assembly.GetTypes(); for (var j = 0; j < types.Length; j++) { Type type = types[j]; if (type.IsInterface || type.IsAbstract || !iType.IsAssignableFrom(type)) continue; var toolbar = (IToolbarProjectSettings)FormatterServices.GetUninitializedObject(type); toolbar.Initialize(settings); list.Add(toolbar); } } #endif list.Sort((s0, s1) => string.Compare(s0.Title, s1.Title, StringComparison.Ordinal)); } catch (Exception) { // Fail silently } return list.ToArray(); } } }