我有一个程序集,我想列出所有继承于特定类/接口的类。
我该如何做到这一点?
类似这样的:
public static IEnumerable<Type> GetSubtypes(Assembly assembly, Type parent)
{
return assembly.GetTypes()
.Where(type => parent.IsAssignableFrom(type));
}
对于简单的情况来说,这很好,但是当你想要找到“实现IEnumerable<T>
的所有类型,其中T
可以是任何类型”等时,它变得更加“有趣”(即棘手)。
(正如Adam所说,你可以轻松地将其转换为扩展方法。这取决于你是否认为你会重用它——扩展方法必须在非嵌套静态类中,这很麻烦...)
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;
}
IEnumerable<T>
的实现还是任何IEnumerable<T>
(即是否指定了 T?)至于扩展方法……我不太会编写许多顶级静态类。仅为扩展方法创建一个类有点过度设计。 - Jon SkeetExtensions
的类中,所以上面的代码应该放在AssemblyExtensions
中。由于本质上很难跟踪,这样做确实有所帮助。 - Sam Harwell