Was ist der einfachste Weg zu testen, ob ein Objekt eine bestimmte Schnittstelle in C # implementiert? (Antwort auf diese Frage in Java )
c#
reflection
interface
JoshRivers
quelle
quelle
if (object is IBlah iblah) { iblah.SomeMethod(); }
Die Verwendung der Operatoren
is
oderas
ist der richtige Weg, wenn Sie den Schnittstellentyp zur Kompilierungszeit kennen und über eine Instanz des zu testenden Typs verfügen. Etwas, das sonst niemand erwähnt zu haben scheint, istType.IsAssignableFrom
:Ich denke, das ist viel ordentlicher als das Durchsehen des von zurückgegebenen Arrays
GetInterfaces
und hat den Vorteil, auch für Klassen zu arbeiten.quelle
typeof(IList).IsAssignableFrom(someType)
, ohne die<>
.Für die Instanz:
Für die Klasse:
Überprüfen Sie, ob
typeof(MyClass).GetInterfaces()
die Schnittstelle enthalten ist.quelle
Wenn Sie das typisierte Objekt nach der Prüfung verwenden möchten:
Seit C # 7.0:
Dies ist das gleiche wie
Siehe .NET-Dokumente: Musterübereinstimmung mit
is
Muster vom Typ #quelle
Eine Variation von @ AndrewKennans Antwort, die ich kürzlich für zur Laufzeit erhaltene Typen verwendet habe:
quelle
Dieser Beitrag ist eine gute Antwort.
Dies ist ein einfaches Beispiel:
oder
quelle
Zusätzlich zum Testen mit dem Operator "is" können Sie Ihre Methoden dekorieren, um sicherzustellen, dass an ihn übergebene Variablen eine bestimmte Schnittstelle implementieren, z. B.:
Ich bin nicht sicher, in welcher Version von .Net dies implementiert wurde, sodass es in Ihrer Version möglicherweise nicht funktioniert.
quelle
Was für mich funktioniert hat ist:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
quelle
Kürzlich habe ich versucht, Andrew Kennans Antwort zu verwenden, und es hat aus irgendeinem Grund bei mir nicht funktioniert. Ich habe dies stattdessen verwendet und es hat funktioniert (Hinweis: Möglicherweise ist das Schreiben des Namespace erforderlich).
quelle
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.
quelle
Ich hatte eine Situation, in der ich eine Variable an eine Methode übergab und nicht sicher war, ob es sich um eine Schnittstelle oder ein Objekt handeln würde.
Die Ziele waren:
Ich habe dies mit folgendem erreicht:
quelle
Das sollte funktionieren :
Aber auch schön:
Oder sogar (nicht sehr elegant):
quelle