我有以下两个接口。
public interface IRegisterToContainer
{
}
public interface IRegisterPerRequest<T> : IRegisterToContainer
{
}
public interface IRegisterPerRequest : IRegisterToContainer
{
}
应用程序引导程序将使用这两个接口,使用反射将类注册到IoC控制器中。
我基本上想要使用任何实现这些接口的类并将其注册到容器中。
这就是我尝试使用反射来注册这些类型的方法
var types = AppDomain.CurrentDomain.GetAssemblies()
.Where(assembly => !assembly.IsDynamic)
.SelectMany(assembly => assembly.GetTypes())
.Where(type => type.IsClass && !type.IsInterface && typeof(IRegisterToContainer).IsAssignableFrom(type))
.ToList();
foreach (Type type in types)
{
// Here I am trying to find any type that is assignable from the IRegisterPerRequest<> interface
if (type.IsGenericType && typeof(IRegisterPerRequest<>).IsAssignableFrom(type))
{
container.RegisterType(type.GetGenericArguments()[0], type, type.FullName, new PerRequestLifetimeManager());
}
// Here if the type implements the IRegisterPerRequest, I want to register it
else if (typeof(IRegisterPerRequest).IsAssignableFrom(type))
{
container.RegisterType(typeof(IRegisterPerRequest), type, type.FullName, new PerRequestLifetimeManager());
}
}
但由于某种原因,第一个条件没有被发现。这是一个用例示例
public interface ICarService
{
public Car GetCarByShape(sting shape);
}
public class CarService ICarService, IRegisterPerRequest<ICarService>
{
protected ICarRepository CarContext;
public CarService(ICarRepository car)
{
CarContext = car;
}
public Car GetCarByShape(sting shape)
{
return CarContext.Find(x => x.Shape == shape)
.FirstOrDefault();
}
}
我基本上是想告诉团结,在运行时将ICarService
类型注册到CarService
。
我验证了types
类CarService
类,但type.IsGenericType && typeof(IRegisterPerRequest<>).IsAssignableFrom(type)
条件失败。 type.IsGenericType
和typeof(IRegisterPerRequest<>).IsAssignableFrom(type)
都返回false
。
如何正确使用反射来检查给定类型是否实现了IRegisterPerRequest<T>
接口?
答案 0 :(得分:1)
这里的想法是查看您的类型实现的每个接口。换句话说,找到一个或多个类型为@Entity
public class Manager extends AbstractEntity {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
的接口,然后使用找到的接口来确定泛型类型。
这是一个例子,
Test#main(..)
答案 1 :(得分:0)
这可能会对您有所帮助:
bool isGenericRPR = type.GetType().GetInterfaces().Any(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IRegisterPerRequest<>));