Je cherchais récemment à détecter grâce à la reflection tous les types d’une assembly qui dérivaient d’un type de base générique, afin d’utiliser une version modifiée de la factory que j’ai déjà présenté sur ce blog. Soit par exemple un type comme celui-ci: class Toto : Base<int> Pour cela, j’ai trouvé sur internet une petite fonction qui fait ça bien comme il faut:

private static bool IsTypeDerivedFromGenericType(Type typeToCheck, Type genericType)
{
	if (typeToCheck == typeof(object))
		return false;
	if (typeToCheck == null)
		return false;
	if (typeToCheck.IsGenericType && typeToCheck.GetGenericTypeDefinition() == genericType)
		return true;
		
	return IsTypeDerivedFromGenericType(typeToCheck.BaseType, genericType);
}

A l’utilisation, on a donc:

Assembly assembly = Assembly.GetExecutingAssembly();

// Loop each type in assembly
foreach (Type type in assembly.GetTypes())
{
	if (type.IsClass && !type.IsAbstract && IsTypeDerivedFromGenericType(type, typeof(GenericManager<>)))
	{
		//...
	}
}

A mettre d’urgence dans votre DLL à tout faire!