Was ist der einfachste Weg zu testen, ob ein Objekt eine bestimmte Schnittstelle in C # implementiert? (Antwort auf diese Frage in Java )
Was ist der einfachste Weg zu testen, ob ein Objekt eine bestimmte Schnittstelle in C # implementiert? (Antwort auf diese Frage in Java )
Antworten:
if (object is IBlah)
oder
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Die Verwendung der Operatoren is
oder as
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, ist Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
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.
typeof(IList).IsAssignableFrom(someType)
, ohne die <>
.
Für die Instanz:
if (obj is IMyInterface) {}
Für die Klasse:
Überprüfen Sie, ob typeof(MyClass).GetInterfaces()
die Schnittstelle enthalten ist.
Wenn Sie das typisierte Objekt nach der Prüfung verwenden möchten:
Seit C # 7.0:
if (obj is IMyInterface myObj)
Dies ist das gleiche wie
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Siehe .NET-Dokumente: Musterübereinstimmung mit is
Muster vom Typ #
Eine Variation von @ AndrewKennans Antwort, die ich kürzlich für zur Laufzeit erhaltene Typen verwendet habe:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
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.:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Ich bin nicht sicher, in welcher Version von .Net dies implementiert wurde, sodass es in Ihrer Version möglicherweise nicht funktioniert.
Was für mich funktioniert hat ist:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
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).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
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:
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);
Das sollte funktionieren :
MyInstace.GetType().GetInterfaces();
Aber auch schön:
if (obj is IMyInterface)
Oder sogar (nicht sehr elegant):
if (obj.GetType() == typeof(IMyInterface))