How to find all the types in an Assembly that Inherit from a Specific Type C#

C#Reflection

C# Problem Overview


How do you get a collection of all the types that inherit from a specific other type?

C# Solutions


Solution 1 - C#

Something like:

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

If you need to handle generics, that gets somewhat trickier (e.g. passing in the open List<> type but expecting to get back a type which derived from List<int>). Otherwise it's simple though :)

If you want to exclude the type itself, you can do so easily enough:

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

Note that this will also allow you to specify an interface and find all the types which implement it, rather than just working with classes as Type.IsSubclassOf does.

Solution 2 - C#

The following method will get a collection of types that inherit a type.

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

If you need to include types that implement an interface see @Jon Skeet's answer.

Solution 3 - C#

You have to enumerate all types and check for each if it inherits the one you're looking for.

Some code like the one in this question may be useful for you.

Solution 4 - C#

Consider using this method (written for a 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();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionaceintheholeView Question on Stackoverflow
Solution 1 - C#Jon SkeetView Answer on Stackoverflow
Solution 2 - C#Tim MurphyView Answer on Stackoverflow
Solution 3 - C#Thomas DaneckerView Answer on Stackoverflow
Solution 4 - C#HappyNomadView Answer on Stackoverflow