using System.Reflection; namespace MatrixRoomUtils.Core.Extensions; public class ClassCollector where T : class { static ClassCollector() { if (!typeof(T).IsInterface) throw new ArgumentException( $"ClassCollector must be used with an interface type. Passed type: {typeof(T).Name}"); } public List ResolveFromAllAccessibleAssemblies() => AppDomain.CurrentDomain.GetAssemblies().SelectMany(ResolveFromAssembly).ToList(); public List ResolveFromObjectReference(object obj) => ResolveFromTypeReference(obj.GetType()); public List ResolveFromTypeReference(Type t) => Assembly.GetAssembly(t)?.GetReferencedAssemblies().SelectMany(ResolveFromAssemblyName).ToList() ?? new List(); public List ResolveFromAssemblyName(AssemblyName assemblyName) => ResolveFromAssembly(Assembly.Load(assemblyName)); public List ResolveFromAssembly(Assembly assembly) => assembly.GetTypes() .Where(x => x is { IsClass: true, IsAbstract: false } && x.GetInterfaces().Contains(typeof(T))).ToList(); // { // List ret = new(); // foreach (var x in assembly.GetTypes().Where(x => x is { IsClass: true, IsAbstract: false } && x.GetInterfaces().Contains(typeof(T))).ToList()) { // // Console.WriteLine($"[!!] Found class {x.FullName}"); // ret.Add(x); // } // return ret; // } }