Supposons les définitions de type suivantes:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Comment savoir si le type Foo
implémente l'interface générique IBar<T>
lorsque seul le type déformé est disponible?
c#
.net
reflection
sduplooy
la source
la source
typeof(IBar<,,,>)
avec des virgules agissant comme des espaces réservésVous devez remonter dans l'arbre d'héritage et trouver toutes les interfaces pour chaque classe dans l'arbre, et comparer
typeof(IBar<>)
avec le résultat de l'appelType.GetGenericTypeDefinition
si l'interface est générique. C'est un peu douloureux, certainement.Voir cette réponse et celles-ci pour plus d'informations et de code.
la source
la source
En tant qu'extension de méthode d'assistance
Exemple d'utilisation:
la source
J'utilise une version légèrement plus simple de la méthode d'extension @GenericProgrammers:
Usage:
la source
Vous devez vérifier par rapport à un type construit de l'interface générique.
Vous devrez faire quelque chose comme ceci:
car
IBar<String>
représente ce type construit. La raison pour laquelle vous devez le faire est que siT
n'est pas défini dans votre vérification, le compilateur ne sait pas si vous voulez direIBar<Int32>
ouIBar<SomethingElse>
.la source
Pour faire face au système de type complètement, je pense que vous devez gérer récursion, par exemple
IList<T>
:ICollection<T>
:IEnumerable<T>
, sans que vous ne savez pas que ,IList<int>
finalement , met en œuvreIEnumerable<>
.la source
Tout d'abord
public class Foo : IFoo<T> {}
ne compile pas car vous devez spécifier une classe au lieu de T, mais en supposant que vous faites quelque chose commepublic class Foo : IFoo<SomeClass> {}
alors si tu le fais
la source
Dans le cas où vous vouliez une méthode d'extension qui prendrait en charge les types de base génériques ainsi que les interfaces, j'ai développé la réponse de sduplooy:
la source
Méthode pour vérifier si le type hérite ou implémente un type générique:
la source
Essayez l'extension suivante.
Pour le tester. créer
et la méthode d'essai
la source
Il ne devrait y avoir aucun problème:
Pour obtenir un crédit supplémentaire, vous pouvez intercepter AmbiguousMatchException si vous souhaitez fournir un paramètre de type générique spécifique avec votre requête IBar.
la source
bool implementsGeneric = (anObject.Implements(typeof(IBar<>).Name) != null);