about summary refs log tree commit diff
path: root/LibMatrix/Extensions/ClassCollector.cs
blob: f53850aa5400b90455e133c9583be5a6ee2112b3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Reflection;

namespace LibMatrix.Extensions;

public class ClassCollector<T> where T : class {
    static ClassCollector() {
        if (!typeof(T).IsInterface)
            throw new ArgumentException(
                $"ClassCollector<T> must be used with an interface type. Passed type: {typeof(T).Name}");
    }

    public List<Type> ResolveFromAllAccessibleAssemblies() => AppDomain.CurrentDomain.GetAssemblies().SelectMany(ResolveFromAssembly).ToList();

    public List<Type> ResolveFromObjectReference(object obj) => ResolveFromTypeReference(obj.GetType());

    public List<Type> ResolveFromTypeReference(Type t) => Assembly.GetAssembly(t)?.GetReferencedAssemblies().SelectMany(ResolveFromAssemblyName).ToList() ?? new List<Type>();

    public List<Type> ResolveFromAssemblyName(AssemblyName assemblyName) => ResolveFromAssembly(Assembly.Load(assemblyName));

    public List<Type> ResolveFromAssembly(Assembly assembly) => assembly.GetTypes()
        .Where(x => x is { IsClass: true, IsAbstract: false } && x.GetInterfaces().Contains(typeof(T))).ToList();
}