如何在程序集中查找从特定类型C#继承的所有类型

ace*_*ole 90 c# reflection

如何获得从特定其他类型继承的所有类型的集合?

Jon*_*eet 146

就像是:

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

如果你需要处理泛型,那会变得有些棘手(例如传入open List<>类型但希望返回一个派生类型List<int>).否则它虽然很简单:)

如果要排除类型本身,可以轻松地完成:

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

请注意,这还允许您指定一个接口并查找实现它的所有类型,而不是像以前那样只使用类Type.IsSubclassOf.

  • 谢谢!我最终使用了这个感谢 - 我最终使用了这个公共静态List <Type> GetAllSubclassesOf(Type baseType){return Assembly.GetAssembly(baseType).GetTypes().Where(type => type.IsSubclassOf(baseType)).ToList(); } (2认同)
  • @Tim:在C#中我们只使用":"...但我通常会将接口视为类型的继承层次结构的一部分. (2认同)

Tim*_*phy 26

以下方法将获取继承类型的类型集合.

C#

public IEnumerable<Type> FindSubClassesOf<TBaseType>()
{   
    var baseType = typeof(TBaseType);
    var assembly = baseType.Assembly;

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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