Получить все типы интерфейсов во всех сборках, на которые есть ссылки в проекте - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть приложение ASP.NET Core 2.1, ссылающееся на пару решений .NET Standard 2.0. Я хочу использовать отражение и получить все типы и фильтры с конкретным реализованным интерфейсом, но он возвращает только общие интерфейсы, поэтому метод IsHandlerInterface никогда не возвращает true.

List<AssemblyName> allAssemblies = Assembly.GetExecutingAssembly()
                                                        .GetReferencedAssemblies()
                                                        .Where(p => p.FullName.StartsWith("Something"))
                                                        .ToList(); // I get 4 assemblies here with the correct results

List<Type> allAssembliesTypes = allAssemblies
                                      .Select(a => a.GetType())
                                      .ToList(); // Retrieving the types

List<Type> handlerTypes = allAssembliesTypes
                                            // typeof(ICommand).Assembly.GetTypes()
                                            .Where(x => x.GetInterfaces().Any(y => IsHandlerInterface(y))) // Here I don't see the handler interface, only the generic ones, see method below
                                            .Where(x => x.Name.EndsWith("Handler")) // Maybe redundant
                                            .ToList();

private static bool IsHandlerInterface(Type type)
        {
            if (!type.IsGenericType)
                return false;

            Type typeDefinition = type.GetGenericTypeDefinition();

            return typeDefinition == typeof(ICommandHandler<>) || typeDefinition == typeof(IQueryHandler<,>);
        }

Пример обработчика ниже.

public sealed class SampleCommandHandler : ICommandHandler<SampleCommand>
    {
        public SampleCommandHandler() // inject services
        {
        }

        public Task<Result> HandleAsync(SampleCommand command)
        {
            // command logic
            // preconditions handle
            // trigger events
            throw new NotImplementedException();
        }
    }

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Этот код возвращает все типы, которые имеют ICommandHandler<> и IQueryHandler<>

var types = Assembly
    .GetEntryAssembly()
    .GetReferencedAssemblies()
    .Select(s => s.GetType())
    .Where(p => typeof(ICommandHandler<>).IsAssignableFrom(p) || typeof(IQueryHandler<>).IsAssignableFrom(p));
0 голосов
/ 15 апреля 2019

Мне удалось получить все сборки, на которые есть ссылки, используя приведенный ниже код.

List<Assembly> all = Assembly.GetEntryAssembly()
                             .GetReferencedAssemblies()
                             .Select(Assembly.Load);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...