【问题标题】:IsAssignableFrom when interface has generics, but not the implementationIsAssignableFrom 当接口具有泛型但没有实现时
【发布时间】:2012-07-28 05:34:07
【问题描述】:

我搜索了这个并找到了这个: How To Detect If Type is Another Generic Type

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

例子:

public interface IMapper<in TSource, out TDestination>
{ ... }

public class StringMapper : IMapper<string, StringBuilder>
{ ... }

Console.WriteLine(typeof(IMapper<,>).IsAssignableFrom(typeof(StringMapper)));

我希望它写成 true,但它写成 false。如何检查一个类是否实现了带有泛型参数的接口?

【问题讨论】:

    标签: c# .net generics reflection


    【解决方案1】:

    我认为您必须从您的 StringMapper 调用 GetInterfaces() 并测试每个 IsGenericType。最后但同样重要的是,通过调用GetGenericTypeDefinition() 获取每个泛型的开放类型(IMapper&lt;,&gt;)并测试它是否匹配typeof(IMapper&lt;,&gt;)

    这就是你所能做的。但请注意,如果该类继承自另一个也实现了某些接口的基类,则不会列出这些。在这种情况下,您必须递归地遍历 BaseType 属性并执行上述操作,直到 BaseType 为空。

    【讨论】:

    • 似乎 GetInterfaces() 实际上包括所有接口,甚至包括那些由基类实现的接口。我已经编辑了它并包含了一些代码。接受编辑后将接受它。 :)
    • 好的,接口不需要递归,但是有一些东西(目前不知道是什么)需要明确地询问基类,否则你会得到错误的结果。跨度>
    • 也许如果你没有通用接口,但通用基类。然后你将不得不进行一些循环/递归。但现在我只在寻找接口......
    【解决方案2】:

    对我来说就像一个魅力。这是一个代码 sn-p 以防万一有人感兴趣:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多