using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Reflection; using System.Linq; namespace YKMoon { public static class YKReflectionUtility { public static Assembly GetAssembly(string assemblyName) { return AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName().Name == assemblyName); } public static System.Type GetManagedReferenceFieldType(string managedReferenceFieldTypename) { var managedReferenceFieldTypenameSplit = managedReferenceFieldTypename.Split(' ').ToArray(); var assemblyName = managedReferenceFieldTypenameSplit[0]; var fieldTypeName = managedReferenceFieldTypenameSplit[1]; var fieldType = GetAssembly(assemblyName).GetType(fieldTypeName); return fieldType; } public static List GetSubclassTypes(System.Type targetSuperType) { List result = new List(); foreach(var type in targetSuperType.Assembly.GetTypes()) { if(!type.IsAbstract && IsBaseTypeContains(type, targetSuperType)) { result.Add(type); } } return result; } public static List GetSubclassTypes() { return GetSubclassTypes(typeof(T)); } public static bool IsBaseTypeContains(System.Type type, System.Type targetSuperType) { if(type.BaseType == null) { return false; } if(type.BaseType == targetSuperType) { return true; } return IsBaseTypeContains(type.BaseType, targetSuperType); } private static List GetClassesByInterface() { List result = new List(); var types = Assembly.GetExecutingAssembly().GetTypes(); foreach(var type in types) { if(type.IsAbstract || type.IsInterface) { continue; } if(type.IsAssignableFrom(typeof(T))) { result.Add(type); } } return result; } } }