在运行时比较两种类型的最安全方法是什么?
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();
}
}
}
我可以提示吗?
答案 0 :(得分:2)
类型ICommandHandler<>
本身并不是一个接口。例如,您永远无法为其分配任何内容。这是一个类型定义,有时也称为开放通用类型。
我认为您正在寻找类型定义为ICommandHandler<>
的任何类型。如果是这样,我想你想要
var types = Assembly.GetExecutingAssembly()
.GetExportedTypes()
.Where
(
r => r.GetInterfaces().Any
(
i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(ICommandHandler<>)
)
);