[C#]Comment déterminer si une instance hérite d'un type construit ouvert ou fermé ?
Salut,
le framework 2.0 ne proposant pas, à ma connaissance, de méthode pour déterminer si une instance hérite d'une classe générique donnée, j'ai écrit la méthode suivante.
Il existe bien la méthode IsSubClassOf mais elle ne permet pas d'interroger une classe générique ouverte.
[FRAMEWORK] 2.0 et >
[USING] System.Collections.Generic
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
class ToolsGeneric
{
static Type TypeofObject = typeof(object); //permet d'effectuer une seule fois la récupération du type
static readonly bool FirstCall= true; //Variable de classe immuable.
/// <summary>
/// Vérifie si un type est de la classe générique spécifiée.
/// </summary>
/// <param name="typeInstance">Type de la classe à vérifier</param>
/// <param name="typeClassGenericRecherchee">Type de la classe générique recherchée. Exemple : MaClasseGeneric<> ou MaClasseGeneric<Client></param>
/// <returns></returns>
private static bool IsSubGenericClassOf(Type typeInstance, Type typeClassGenericRecherche, bool VerificationTypeRecherche)
{
//On vérifie, seulement lors du premier appel, si typeClassGenericRecherche est une classe générique
if ((VerificationTypeRecherche) & !(typeClassGenericRecherche.IsGenericType))
throw new ArgumentException("La classe recherchée n'est pas une classe générique. Utilisez la méthode Type.IsSubclassOf.");
if (typeInstance == TypeofObject)
return false; //Super classe atteinte sans résultat
//La classe de typeInstance est bien une classe générique
if (typeInstance.IsGenericType)
//Est-ce que le type immédiat de l'instance hérite de la classe générique recherchée.
//On teste une classe générique fermée, exemple MaClasse<String,Int>
if (typeInstance == typeClassGenericRecherche)
return true;
//Est-ce que le type immédiat de l'instance hérite de la classe générique recherchée.
//On teste une classe générique ouverte, exemple MaClasse<,>
else if (typeInstance.GetGenericTypeDefinition() == typeClassGenericRecherche)
return true;
//L'instance n'est pas une classe générique,fermée ou ouverte, ou bien n'est pas du type recherchée.
//On contrôle l'ancêtre...
return IsSubGenericClassOf(typeInstance.BaseType, typeClassGenericRecherche,!FirstCall);
}
public static bool IsSubGenericClassOf(Type typeInstance, Type typeClassGenericRecherche)
{
return IsSubGenericClassOf(typeInstance, typeClassGenericRecherche, FirstCall);
}
/// <summary>
/// Vérifie si une instance est de la classe générique spécifiée.
/// </summary>
/// <param name="instance">Instance à tester.</param>
/// <param name="classGeneric">Type de la classe générique recherchée. Exemple : MaClasseGeneric<> ou MaClasseGeneric<Client></param>
public static bool IsSubGenericClassOf(object instance, Type typeClassGenericRecherchee)
{
return IsSubGenericClassOf(instance.GetType(), typeClassGenericRecherchee);
}
} |
Exemple d'appel :
Code:
1 2 3 4 5 6 7 8
|
public class Produit...
public class ClasseUtilisatrice : ClasseUtilisatriceBase<Produit>...
if (ToolsGeneric.IsSubGenericClassOf(clsUtil, typeof(ClasseUtilisatriceBase<>))
Console.WriteLine("L'instance est dérivée du type générique {0}", typeGenerique); |
Je suppose le type suivant :
Code:
typeof(ClasseUtilisatriceBase<>)
identique à
Code:
typeof(ClasseUtilisatriceBase<Produit>)
et à tous ces dérivées.
ps:
Débutant avec ce langage il va s'en dire que ce code peut être amélioré.