/// <summary> /// A convenient method for calling the above. /// Example usage: /// List<System.Type> subTypes = EditorUtility.FindDerivedTypes(typeof(BaseTimelineEvent)).ToList(); /// </summary> /// <param name="baseType"></param> /// <param name="classOnly"></param> /// <returns></returns> public static System.Type[] FindDerivedTypes(System.Type baseType, bool classOnly = true) { //return FindDerivedTypesFromAssembly(System.Reflection.Assembly.GetAssembly(baseType), baseType, classOnly); System.Type[] result = new System.Type[0]; foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies()) { result = result.Concat(FindDerivedTypesFromAssembly(assembly, baseType, classOnly)).ToArray(); } return(result); }
/// <summary> /// A convenient method for calling the above, but for ALL assemblies. /// Example usage: /// List<System.Type> subTypes = EditorUtility.FindDerivedTypes(typeof(BaseTimelineEvent)).ToList(); /// </summary> /// <param name="baseType"></param> /// <param name="classOnly"></param> /// <returns></returns> public static System.Type[] FindDerivedTypes(System.Type baseType, bool classOnly = true) { #if UNITY_2019_2_OR_NEWER var results = TypeCache.GetTypesDerivedFrom(baseType).ToArray(); if (classOnly) { return(results.Where(x => x.IsClass).ToArray()); } else { return(results.ToArray()); } #else System.Type[] typeArray = new System.Type[0]; var retval = typeArray.Concat(typeArray); foreach (var assem in System.AppDomain.CurrentDomain.GetAssemblies()) { retval = retval.Concat(FindDerivedTypesFromAssembly(assem, baseType, classOnly)); } return(retval.ToArray()); #endif }