Answers:
就像是:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
如果您需要处理泛型,那会有些棘手(例如,传入开放List<>
类型,但希望取回派生自的类型List<int>
)。否则虽然很简单:)
如果要排除类型本身,则可以很容易地做到这一点:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
请注意,这还将允许您指定接口并找到实现该接口的所有类型,而不仅仅是像使用类那样Type.IsSubclassOf
。
IsAssignableFrom
应该也可以。特别是我的版本也可以处理接口。你测试我的代码了吗?我的答案在什么情况下失败?
以下方法将获取继承一个类型的类型的集合。
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
如果您需要包括实现接口的类型,请参见@Jon Skeet的答案。
考虑使用此方法(为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();
}