c # самый безопасный способ проверить, содержит ли тип тип в своих интерфейсах - PullRequest
4 голосов
/ 06 апреля 2019

Какой самый безопасный способ сравнить два типа во время выполнения?

public interface IHandler<T> where T : Command {

}

public class CleanupHandler : IHandler<CleanupCommand> {
}

var Handlers = GetServices(typeof(IHandler<Cleanup>));


static IEnumerable<object> GetServices(Type serviceType) {
            var services= _services.Where(r => r.implementationType.GetInterfaces().Contains(serviceType)) /* issue here */
                                   .Select(r => r.implementation);

            return services;
 }

_services является перечислимым

public class Metadata {
    public Type serviceType { get; protected set; }
    public Type implementationType { get; protected set; }
    public object implementation { get; protected set; }
}

если мы изменим чек с:

r.implementationType.GetInterfaces().Contains(serviceType)

до

r.implementationType.GetInterfaces().Count(x => x.Name == serviceType.Name) > 0

это работает, но это совсем не безопасно, тип действительно такой же, но он не работает.

Редактировать:

namespace ConsoleApp {
    class Command {

    }

    interface ICommandHandler<T> where T : Command {

    }

    class Cleanup : Command {

    }

    class CleanupHandler: ICommandHandler<Cleanup> {

    }

    class Program {
        static void Main(string[] args) {

            var types = Assembly.GetExecutingAssembly().GetExportedTypes()
                .Where(r => r.GetInterfaces().Contains(typeof(ICommandHandler<>)));

            Console.ReadKey();
        }
    }
}

Могу ли я получить подсказку?

1 Ответ

2 голосов
/ 06 апреля 2019

Тип ICommandHandler<> на самом деле не является интерфейсом.Например, вы никогда ничего не можете назначить на это.Это определение типа или иногда его называют открытым универсальным типом.

Я думаю, что вы ищете любой тип, который имеет определение типа ICommandHandler<>.Если это так, я думаю, вы хотите

var types = Assembly.GetExecutingAssembly()
    .GetExportedTypes()
    .Where
    (
        r => r.GetInterfaces().Any
        (
            i => i.IsGenericType 
              && i.GetGenericTypeDefinition() == typeof(ICommandHandler<>)
        )
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...