wake-up-neo.com

Testen Sie, ob das Objekt die Schnittstelle implementiert

Was ist der einfachste Weg, um zu testen, ob ein Objekt eine bestimmte Schnittstelle in C # implementiert? (Antwort auf diese Frage in Java )

305
JoshRivers
if (object is IBlah)

oder

IBlah myTest = originalObject as IBlah

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

Die Verwendung der Operatoren is oder as ist der richtige Weg, wenn Sie den Schnittstellentyp zur Kompilierzeit kennen und über eine Instanz des Typs verfügen, den Sie testen. Was sonst niemand erwähnt zu haben scheint, ist Type.IsAssignableFrom:

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

Ich denke, das ist viel netter als der Blick durch das von GetInterfaces zurückgegebene Array und hat den Vorteil, auch für Klassen zu arbeiten.

203
Andrew Kennan

Für die Instanz:

if (obj is IMyInterface) {}

Für die Klasse:

Prüfen Sie, ob typeof(MyClass).GetInterfaces() die Schnittstelle enthält.

19
Rauhotz

Eine Variante der Antwort von @ AndrewKennan, die ich kürzlich für Typen verwendet habe, die zur Laufzeit abgerufen wurden:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}
15
famousgarkin

Wenn Sie das typecasted Objekt nach der Prüfung verwenden möchten:
Seit C # 7.0:

if (obj is IMyInterface myObj)

Das ist das Gleiche wie

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)

Siehe .NET Docs: Musterabgleich mit is # Typmuster

5
MA-Maddin

Diese Post ist eine gute Antwort.

public interface IMyInterface {}

public class MyType : IMyInterface {}

Dies ist ein einfaches Beispiel: 

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

oder

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
3
eliasetm

Zusätzlich zum Testen mit dem "is" -Operator können Sie Ihre Methoden so gestalten, dass die an sie übergebenen Variablen eine bestimmte Schnittstelle implementieren, wie z.

public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
     //Some bubbly sorting
}

Ich bin mir nicht sicher, in welcher Version von .Net dies implementiert wurde, sodass es in Ihrer Version möglicherweise nicht funktioniert.

3
jamesmillerio

Was bei mir funktioniert hat ist:

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

2
Dutchman078

Vor kurzem habe ich versucht, Andrew Kennans Antwort zu verwenden, und es funktionierte für mich aus irgendeinem Grund nicht. Ich habe dies stattdessen verwendet und es hat funktioniert (Hinweis: das Schreiben des Namespaces ist möglicherweise erforderlich).

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
1
jahu

Ich hatte eine Situation, in der ich eine Variable an eine Methode übergeben hatte und nicht wusste, ob es sich um eine Schnittstelle oder ein Objekt handelt. 

Die Ziele waren:

  1. Wenn item eine Schnittstelle ist, instantiieren Sie ein Objekt basierend auf dieser Schnittstelle, wobei die Schnittstelle ein Parameter im Konstruktoraufruf ist.
  2. Wenn es sich bei dem Element um ein Objekt handelt, geben Sie eine Null zurück, da der Konstruktor für meine Aufrufe eine Schnittstelle erwartet und ich nicht möchte, dass der Code gefüllt wird.

Das habe ich mit folgendem erreicht:

    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

Ich benutzte

Assert.IsTrue(myObject is ImyInterface);

für einen Test in meinem Unit-Test, der testet, dass myObject ein Objekt ist, das meine Schnittstelle ImyInterface implementiert hat.

0
iamrcw