web-dev-qa-db-fra.com

Test si l'objet implémente l'interface

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 )

305
JoshRivers
if (object is IBlah)

ou

IBlah myTest = originalObject as IBlah

if (myTest != null)
505
Robert C. Barth

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.

203
Andrew Kennan

Pour l'instance:

if (obj is IMyInterface) {}

Pour la classe:

Vérifiez si typeof(MyClass).GetInterfaces() contient l'interface.

19
Rauhotz

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
}
15
famousgarkin

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

5
MA-Maddin

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))
3
eliasetm

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.

3
jamesmillerio

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)
1
jahu

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:

  1. Si item est une interface, instanciez un objet basé sur cette interface, l'interface étant un paramètre de l'appel du constructeur.
  2. Si l'élément est un objet, retournez la valeur null car le constuctor de mes appels attend une interface et je ne voulais pas que le code soit stocké.

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);
0
Anthony Tristan