Determine if a class is a subclass of a type with several typical parameters

Given the following class hierarchy

public abstract class MyGenericClass<T1, T2> { public T1 Foo { get; set; } public T2 Bar { get; set; } } public class BobGeneric : MyGenericClass<int, string>{} public class JimGeneric : MyGenericClass<System.Net.Cookie, System.OverflowException>{} 

I would think I could do the following

 //All types in the assembly containing BobGeneric and JimGeneric var allTypes = _asm.GetTypes(); //This works for interfaces, but not here var specialTypes = allTypes.Where(x => typeof(MyGenericClass<,>).IsAssignableFrom(x)) //This also fails typeof(BobGeneric).IsSubclassOf(typeof(MyGenericClass<,>)).Dump(); 

How would I define the code that BobGeneric inherits from MyGenericClass ?

+4
source share
1 answer

You are looking for GetGenericTypeDefinition :

 typeof(BobGeneric).GetGenericTypeDefinition().IsSubclassOf(typeof(MyGenericClass<,>)).Dump(); 

You can imagine this method as β€œdeleting all” arguments of a general type by simply leaving the original definition with its formal typical parameters.

If it does not work directly on BobGeneric , you may have to move up the type hierarchy until you find MyGenericClass<...,...> (or any type for which IsGenericType returns true ).

+7
source

Source: https://habr.com/ru/post/1489141/


All Articles