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 )
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 )
Réponses:
if (object is IBlah)
ou
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
L'utilisation des opérateurs is
ou as
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é est Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
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.
typeof(IList).IsAssignableFrom(someType)
sans <>
.
Par exemple:
if (obj is IMyInterface) {}
Pour la classe:
Vérifiez si typeof(MyClass).GetInterfaces()
contient l'interface.
Si vous souhaitez utiliser l'objet transtypé après la vérification:
Depuis C # 7.0:
if (obj is IMyInterface myObj)
C'est la même chose que
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Voir Docs .NET: correspondance de modèle avec is
modèle de type #
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:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
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:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Je ne sais pas dans quelle version de .Net cela a été implémenté, donc cela peut ne pas fonctionner dans votre version.
Ce qui a fonctionné pour moi, c'est:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
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).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
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:
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);
Cela devrait fonctionner:
MyInstace.GetType().GetInterfaces();
Mais sympa aussi:
if (obj is IMyInterface)
Ou même (pas très élégant):
if (obj.GetType() == typeof(IMyInterface))