2010-12-12 6 views
3

J'ai la routine utilitaire suivant qui déterminent si un type dérive d'un type spécifique:Déterminer le type de dérivation de type générique

private static bool DerivesFrom(Type rType, Type rDerivedType) 
{ 
    while ((rType != null) && ((rType != rDerivedType))) 
     rType = rType.BaseType; 
    return (rType == rDerivedType); 
} 

(en fait je ne sais pas s'il y a un moyen plus pratique pour tester la dérivation ...)

Le problème est que je veux déterminer si un type dérive d'un type générique, mais sans spécifier les arguments génériques.

Par exemple, je peux écrire:

DerivesFrom(typeof(ClassA), typeof(MyGenericClass<ClassB>)) 

mais ce que je besoin est le suivant

DerivesFrom(typeof(ClassA), typeof(MyGenericClass)) 

Comment puis-je réaliser?


Sur la base de l'exemple de Darin Miritrov, ceci est un exemple d'application:

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class MyGenericClass<T> { } 
    public class ClassB {} 
    public class ClassA : MyGenericClass<ClassB> { } 

    class Program 
    { 
     static void Main() 
     { 
      bool result = DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>)); 
      Console.WriteLine(result); // prints **false** 
     } 

     private static bool DerivesFrom(Type rType, Type rDerivedType) 
     { 
      return rType.IsSubclassOf(rDerivedType); 
     } 
    } 
} 

Répondre

5

Vous pouvez laisser le paramètre générique ouvert:

DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>)); 

devrait fonctionner. Exemple:

public class ClassA { } 
public class MyGenericClass<T>: ClassA { } 

class Program 
{ 
    static void Main() 
    { 
     var result = DerivesFrom(typeof(MyGenericClass<>), typeof(ClassA)); 
     Console.WriteLine(result); // prints True 
    } 

    private static bool DerivesFrom(Type rType, Type rDerivedType) 
    { 
     return rType.IsSubclassOf(rDerivedType); 
    } 
} 

Notez également l'utilisation de IsSubClassOf méthode qui devrait simplifier la méthode DerivesFrom et le type de contrecarre son objectif. Il y a aussi la méthode IsAssignableFrom que vous pouvez regarder.

+0

@Luca, avez-vous regardé l'échantillon que j'ai fourni? Qu'est ce qui ne va pas avec ça? Vous avez une classe de base et une classe générique dérivée exactement comme vous l'avez décrit dans votre question. L'utilisation d'un type générique ouvert fonctionne au moins dans cet exemple. Si cela ne fonctionne pas pour vous, vous devrez fournir un exemple complet avec votre hiérarchie de classe afin que nous puissions voir ce qui ne va pas. –

+0

Oui, en fait j'ai passé en revue mes commentaires: L'exemple fonctionne. Je dois approfondir mon application. – Luca

+0

Trouvé pourquoi mon application ne fonctionne pas. Voir l'exemple: ClassA dérive du type générique, pas viceversa. – Luca

Questions connexes