【问题标题】:List all classes that inherit from a specific class/interface列出从特定类/接口继承的所有类
【发布时间】:2010-01-25 15:37:39
【问题描述】:

我有一个程序集,我想列出从特定类/接口继承的所有类。

我该怎么做?

【问题讨论】:

    标签: c#


    【解决方案1】:

    类似:

    public static IEnumerable<Type> GetSubtypes(Assembly assembly, Type parent)
    {
        return assembly.GetTypes()
                       .Where(type => parent.IsAssignableFrom(type));
    }
    

    这对于简单的情况很好,但是当您想找到“所有类型为任何T 实现IEnumerable&lt;T&gt;”等时,它变得更加“有趣”(阅读:棘手)。

    (正如亚当所说,你可以很容易地把它变成一个扩展方法。这取决于你是否认为你会重用它——扩展方法必须在非嵌套的静态类中是很痛苦的...... )

    【讨论】:

    • 我像往常一样被Skeeted。不妨也让它成为一种扩展方法。
    • @Jon,如果“你想找到”所有类型为任何 T 实现 IEnumerable 等等,你会怎么做?您还说“扩展方法必须在非嵌套静态类中是一种痛苦”。为什么?你经常使用嵌套类吗?谢谢。
    • @Joan:我需要知道它是否正在寻找 particular IEnumerable&lt;T&gt;any IEnumerable&lt;T&gt; 的实现(即是否指定了 T?)至于扩展方法......我不倾向于编写许多顶级静态类。只为扩展方法创建一个有点矫枉过正。
    • 我做了如下轻微修正:) private IEnumerable GetSubType(Assembly asm , Type parent) { return asm.GetTypes().Where(type => parent.IsAssignableFrom(type)) ; } 对不起,我不知道怎么做评论中的代码块。
    • @Jon:好吧,现在不用感谢我。我以为我得到了我想要的东西,但仍然没有工作:(我应该说我做了改变。这样听起来就不会像我修复了什么。
    【解决方案2】:
    public static IEnumerable<Type> GetTypesThatInheritFrom<T>(this Assembly asm)
    {
        var types = from t in asm.GetTypes()
                    where typeof(T).IsAssignableFrom(t)
                    select t;
        return types;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多