(Reposté en raison d'une refonte massive)
La réponse au code de JaredPar est fantastique, mais j'ai un conseil qui le rendrait inutile si vos types génériques ne sont pas basés sur des paramètres de type valeur. J'étais bloqué sur la raison pour laquelle l'opérateur "is" ne fonctionnait pas, donc j'ai également documenté les résultats de mes expérimentations pour référence future. Veuillez améliorer cette réponse pour en renforcer la clarté.
CONSEIL :
Si vous vous assurez que l'implémentation de votre classe générique hérite d'une classe de base abstraite non générique telle que GenericClassBase, vous pourriez poser la même question sans aucun problème du tout comme ceci :
typeof(Test).IsSubclassOf(typeof(GenericClassBase))
IsSubclassOf()
Mes tests indiquent que IsSubclassOf() ne fonctionne pas sur des types génériques sans paramètres tels que
typeof(GenericClass<>)
alors qu'il fonctionnera avec
typeof(GenericClass)
Par conséquent, le code suivant fonctionnera pour n'importe quelle dérivation de GenericClass<>, en supposant que vous acceptiez de tester en fonction de SomeType :
typeof(Test).IsSubclassOf(typeof(GenericClass))
Le seul moment où je peux imaginer que vous souhaiteriez tester par GenericClass<> est dans un scénario de framework de plug-in.
Réflexions sur l'opérateur "is"
À la conception, C# n'autorise pas l'utilisation de génériques sans paramètres car ils ne représentent essentiellement pas un type complet du CLR à ce stade. Par conséquent, vous devez déclarer des variables génériques avec des paramètres, et c'est pourquoi l'opérateur "is" est si puissant pour travailler avec des objets. Incidemment, l'opérateur "is" ne peut pas non plus évaluer les types génériques sans paramètres.
L'opérateur "is" testera l'ensemble de la chaîne d'héritage, y compris les interfaces.
Ainsi, étant donné une instance de n'importe quel objet, la méthode suivante fera l'affaire :
bool EstTypeDe(objet t)
{
return (t is T);
}
C'est un peu redondant, mais j'ai pensé que je le visualiserais quand même pour tout le monde.
Étant donné
var t = new Test();
Les lignes de code suivantes renverraient true :
bool test1 = EstTypeDe>(t);
bool test2 = EstTypeDe>(t);
bool test3 = EstTypeDe(t);
En revanche, si vous voulez quelque chose de spécifique à GenericClass, vous pourriez le rendre plus spécifique, je suppose, comme ceci :
bool EstTypeDeGenericClass(objet t)
{
return (t is GenericClass);
}
Ensuite, vous testeriez comme ceci :
bool test1 = EstTypeDeGenericClass(t);