Quelle est la manière la plus simple de tester si un objet implémente une interface donnée en C #? (Réponse à cette question en Java )
c#
reflection
interface
JoshRivers
la source
la source
if (object is IBlah iblah) { iblah.SomeMethod(); }
L'utilisation des opérateurs
is
ouas
est la bonne façon si vous connaissez le type d'interface au moment de la compilation et avez une instance du type que vous testez. Quelque chose que personne d'autre ne semble avoir mentionné estType.IsAssignableFrom
:Je pense que c'est beaucoup plus net que de regarder à travers le tableau retourné par
GetInterfaces
et a l'avantage de travailler aussi pour les classes.la source
typeof(IList).IsAssignableFrom(someType)
sans<>
.Par exemple:
Pour la classe:
Vérifiez si
typeof(MyClass).GetInterfaces()
contient l'interface.la source
Si vous souhaitez utiliser l'objet transtypé après la vérification:
Depuis C # 7.0:
C'est la même chose que
Voir Docs .NET: correspondance de modèle avec
is
modèle de type #la source
Une variante de la réponse de @ AndrewKennan que j'ai fini par utiliser récemment pour les types obtenus lors de l'exécution:
la source
Ce message est une bonne réponse.
Voici un exemple simple:
ou
la source
En plus de tester en utilisant l'opérateur "is", vous pouvez décorer vos méthodes pour vous assurer que les variables qui lui sont passées implémentent une interface particulière, comme ceci:
Je ne sais pas dans quelle version de .Net cela a été implémenté, donc cela peut ne pas fonctionner dans votre version.
la source
Ce qui a fonctionné pour moi, c'est:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
la source
Récemment, j'ai essayé d'utiliser la réponse d'Andrew Kennan et cela n'a pas fonctionné pour moi pour une raison quelconque. Je l'ai utilisé à la place et cela a fonctionné (note: l'écriture de l'espace de noms peut être nécessaire).
la source
j'ai utilisé
Assert.IsTrue(myObject is ImyInterface);
pour un test dans mon test unitaire qui teste que myObject est un objet qui a implémenté mon interface ImyInterface.
la source
J'ai eu une situation où je passais une variable à une méthode et ne savais pas si ça allait être une interface ou un objet.
Les objectifs étaient les suivants:
J'ai atteint cet objectif avec les éléments suivants:
la source
Cela devrait fonctionner:
Mais sympa aussi:
Ou même (pas très élégant):
la source