Was ist der einfachste Weg, um zu testen, ob ein Objekt eine bestimmte Schnittstelle in C # implementiert? (Antwort auf diese Frage in Java )
if (object is IBlah)
oder
IBlah myTest = originalObject as IBlah
if (myTest != null)
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.
Für die Instanz:
if (obj is IMyInterface) {}
Für die Klasse:
Prüfen Sie, ob typeof(MyClass).GetInterfaces()
die Schnittstelle enthält.
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
}
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
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))
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.
Was bei mir funktioniert hat ist:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
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)
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:
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);
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.