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

时间:2009-08-12 20:01:24

标签: c# reflection

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

4 个答案:

答案 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