Say I have:
public class Base<T> {}
public class MyBaseOne : Base<int> {}
public class MyBaseTwo : Base<int> {}
Having T type (say int) how to find all classes that expand Base in the assembly and be able to construct new objects of them?
You can use Type.IsAssignableFrom
:
var typeArgument = typeof(int);
var baseType = typeof(Base<>).MakeGenericType(typeArgument);
var matches = someAssembly.GetTypes()
.Where(t => typeof(baseType).IsAssignableFrom(t));
That will work for the examples you've shown, but won't find (say) Child<T>
where Child
is described as:
public class Child<T> : Base<T>
I'm assuming you do want to find classes that are assignable to Base<T>
but don't have Base<T>
as the direct superclass (i.e. a longer type hierarchy). If you don't, it's even easier:
var matches = someAssembly.GetTypes().Where(t => t.BaseType == baseType);
See more on this question at Stackoverflow