Какой самый безопасный способ сравнить два типа во время выполнения?
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();
}
}
}
Могу ли я получить подсказку?