如何查找inheritance自特定types的程序集中的所有typesC#

你如何得到从一个特定的其他typesinheritance的所有types的集合?

就像是:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) { return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)); } 

如果你需要处理generics,那会有点棘手(例如传入打开的List<>types,但期望得到从List<int>派生的types)。 否则它很简单,虽然:)

如果你想排除types本身,你可以很容易地做到这一点:

 public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) { return assembly.GetTypes().Where(t => t != baseType && baseType.IsAssignableFrom(t)); } 

请注意,这也将允许您指定一个接口并查找实现它的所有types,而不是像Type.IsSubclassOf一样使用类。

以下方法将获得inheritance一个types的types的集合。

C#

 public IEnumerable<Type> FindSubClassesOf<TBaseType>() { var baseType = typeof(TBaseType); var assembly = baseType.Assembly; return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)); } 

VB.NET

 Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type) Dim baseType = GetType(TBaseType) Dim assembly = baseType.Assembly Return From t In assembly.GetTypes() Where t.IsSubClassOf(baseType) Select t End Function 

如果您需要包含实现接口的types,请参阅@Jon Skeet的答案。

你必须枚举所有types,并检查每一个,如果它inheritance了你正在寻找的。

这个问题中的一些代码可能对您有用。

考虑使用这种方法(为PCL编写):

 public IEnumerable<Type> FindDerivedTypes( Assembly assembly, Type baseType ) { TypeInfo baseTypeInfo = baseType.GetTypeInfo(); bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface; return from type in assembly.DefinedTypes where isClass ? type.IsSubclassOf( baseType ) : isInterface ? type.ImplementedInterfaces.Contains( baseTypeInfo.AsType() ) : false select type.AsType(); }