列出所有继承特定类/接口的类。

6

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

我该如何做到这一点?

2个回答

7

类似这样的:

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

对于简单的情况来说,这很好,但是当你想要找到“实现IEnumerable<T>的所有类型,其中T可以是任何类型”等时,它变得更加“有趣”(即棘手)。

(正如Adam所说,你可以轻松地将其转换为扩展方法。这取决于你是否认为你会重用它——扩展方法必须在非嵌套静态类中,这很麻烦...)


我像往常一样被“Skeeted”了。不妨也把它变成一个扩展方法。 - Adam Robinson
@Jon,如果“你想找到实现IEnumerable<T>的所有类型”,你会怎么做?此外,你说“扩展方法必须在非嵌套静态类中”很麻烦。为什么?你经常使用嵌套类吗?谢谢。 - Joan Venge
@Joan:我需要知道它是在寻找一个特定的 IEnumerable<T> 的实现还是任何 IEnumerable<T>(即是否指定了 T?)至于扩展方法……我不太会编写许多顶级静态类。仅为扩展方法创建一个类有点过度设计。 - Jon Skeet
我进行了以下微小的更正 :) private IEnumerable<Type> GetSubType(Assembly asm , Type parent) { return asm.GetTypes().Where(type => parent.IsAssignableFrom(type)); }很抱歉,我无法在评论中找到如何执行代码块。 - IAbstract
@Jon:好吧,现在不用感谢我。我以为我得到了我想要的,但还是不起作用:( 我应该说我做了一个更改。这样就不会听起来像我修复了什么东西。 - IAbstract
@Jon:我把扩展方法放在一个名为ThisTypeExtensions的类中,所以上面的代码应该放在AssemblyExtensions中。由于本质上很难跟踪,这样做确实有所帮助。 - Sam Harwell

3
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接