如何获得从特定其他类型继承的所有类型的集合?
答案 0 :(得分:139)
类似的东西:
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
一样使用类。
答案 1 :(得分:26)
以下方法将获得继承类型的类型集合。
<强> 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的答案。
答案 2 :(得分:1)
您必须枚举所有类型并检查每个类型是否继承了您正在寻找的类型。
this question中的某些代码可能对您有用。
答案 3 :(得分:1)
考虑使用此方法(为PCL编写):
GOPATH