Quel est le moyen le plus simple de tester si un objet implémente une interface donnée en C #? (Réponse à cette question en Java )
if (object is IBlah)
ou
IBlah myTest = originalObject as IBlah
if (myTest != null)
L'utilisation des opérateurs is
ou as
est la méthode correcte si vous connaissez le type d'interface au moment de la compilation et si vous avez une instance du type que vous testez. Quelque chose que personne ne semble avoir mentionné est Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Je pense que cela est beaucoup plus pratique que de parcourir le tableau renvoyé par GetInterfaces
et présente l’avantage de travailler pour les classes également.
Pour l'instance:
if (obj is IMyInterface) {}
Pour la classe:
Vérifiez si typeof(MyClass).GetInterfaces()
contient l'interface.
Une variante de la réponse de @ AndrewKennan que j'ai finalement utilisée récemment pour les types obtenus au moment de l'exécution:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
Si vous souhaitez utiliser l'objet typecasted après la vérification:
Depuis C # 7.0:
if (obj is IMyInterface myObj)
C'est pareil que
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Voir .NET Docs: Correspondance de modèle avec is
# Type pattern
This Post est une bonne réponse.
public interface IMyInterface {}
public class MyType : IMyInterface {}
Ceci est un exemple simple:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
ou
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
En plus de tester à l'aide de l'opérateur "is", vous pouvez décorer vos méthodes pour vous assurer que les variables qui lui sont transmises implémentent une interface particulière, comme suit:
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é, cela pourrait donc ne pas fonctionner dans votre version.
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. J'ai utilisé cela à 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'étais dans une situation où je passais une variable à une méthode et je ne savais pas si cela allait être une interface ou un objet.
Les objectifs étaient:
J'ai réalisé ceci avec ce qui suit:
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);