Tester 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)

291
demandé sur Community 2009-01-04 04:25:10

12 réponses

if (object is IBlah)

Ou

IBlah myTest = originalObject as IBlah

if (myTest != null)
481
répondu Robert C. Barth 2009-01-04 01:28:01

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 propre que de regarder à travers le tableau retourné par GetInterfaces et a l'avantage de travailler aussi pour les classes.

196
répondu Andrew Kennan 2009-01-07 00:17:59

Pour l'exemple:

if (obj is IMyInterface) {}

Pour la classe:

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

19
répondu Rauhotz 2009-01-04 02:07:08

Une variation sur la réponse de @AndrewKennan que j'ai fini par utiliser récemment pour les types obtenus à l'exécution:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}
12
répondu famousgarkin 2017-07-27 12:41:33

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 transmises 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 suis pas sûr de la version de.Net dans laquelle cela a été implémenté, donc cela peut ne pas fonctionner dans votre version.

2
répondu jamesmillerio 2009-01-06 23:57:14

Ce qui a fonctionné pour moi est:

Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));

2
répondu Dutchman078 2016-09-16 12:55:13

Si vous souhaitez utiliser l'objet typecasted 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 les documents. net: Pattern matching with is # Type pattern

2
répondu MA-Maddin 2018-06-27 12:41:10

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é ceci à la place et cela a fonctionné (note: l'écriture de l'espace de noms pourrait être requise).

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
1
répondu jahu 2014-11-06 12:55:06

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.

0
répondu iamrcw 2014-07-11 09:52:08

Ce 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))
0
répondu eliasetm 2017-07-23 17:11:16

J'ai eu une situation où je passais une variable à une méthode et je ne savais pas si ce serait 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 dans l'appel du constructeur.
  2. Si l'élément est un objet, renvoyez un null puisque le constuctor pour mes appels attend une interface et je ne voulais pas que le code soit réservoir.

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
répondu Anthony Tristan 2018-07-24 19:45:50

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))
-13
répondu Yoann. B 2009-01-04 02:02:27