当接口有泛型,但没有实现时,IsAssignableFrom

本文关键字:实现 IsAssignableFrom 泛型 接口 | 更新日期: 2023-09-27 17:58:02

我已经搜索过了,找到了这个:如何检测类型是否为另一个通用类型

此解决方案的问题在于,它希望实现具有相同的类型参数。我想看看一个类是否实现了一个带有任何类型参数的接口。

示例:

public interface IMapper<in TSource, out TDestination>
{ ... }
public class StringMapper : IMapper<string, StringBuilder>
{ ... }
Console.WriteLine(typeof(IMapper<,>).IsAssignableFrom(typeof(StringMapper)));

我想写的是真的,但它写的是假的。如何检查类是否实现了具有泛型参数的接口?

当接口有泛型,但没有实现时,IsAssignableFrom

我认为您必须从StringMapper中调用GetInterfaces(),并对每个IsGenericType进行测试。最后但同样重要的是,通过调用GetGenericTypeDefinition()来获得每个泛型的开放类型(IMapper<,>),并测试它是否与typeof(IMapper<,>)匹配。

这就是你所能做的。但要注意,如果这个类从另一个基类继承,而这个基类也实现了一些接口,那么这些接口就不会被列出。在这种情况下,您必须递归地向下运行BaseType属性,并执行上述操作,直到BaseType为null。

工作对我来说很有魅力。如果有人感兴趣,这里有一个代码片段:

    IEnumerable<Type> reports =
        from type in GetType().Assembly.GetTypes()
        where
            type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IReport<>)) &&
            type.IsClass
        select type;