如何查找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(); }