using System.Reflection; namespace LibMatrix.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(); }