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);
}
} |
Partager