如何检查类型是否实现了泛型类型的接口?

时间:2018-04-13 20:11:28

标签: c# reflection dependency-injection inversion-of-control unity-container

我有以下两个接口。

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

我验证了typesCarService类,但type.IsGenericType && typeof(IRegisterPerRequest<>).IsAssignableFrom(type)条件失败。 type.IsGenericTypetypeof(IRegisterPerRequest<>).IsAssignableFrom(type)都返回false

如何正确使用反射来检查给定类型是否实现了IRegisterPerRequest<T>接口?

2 个答案:

答案 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<>));