¿Cuál es la forma más simple de probar si un objeto implementa una interfaz dada en C #? (Respuesta a esta pregunta en Java )
c#
reflection
interface
JoshRivers
fuente
fuente
if (object is IBlah iblah) { iblah.SomeMethod(); }
Usar los operadores
is
oas
es la forma correcta si conoce el tipo de interfaz en tiempo de compilación y tiene una instancia del tipo que está probando. Algo que nadie más parece haber mencionado esType.IsAssignableFrom
:Creo que esto es mucho más ordenado que mirar a través de la matriz devuelta
GetInterfaces
y también tiene la ventaja de trabajar para las clases.fuente
typeof(IList).IsAssignableFrom(someType)
, sin el<>
.Por ejemplo:
Para la clase:
Compruebe si
typeof(MyClass).GetInterfaces()
contiene la interfaz.fuente
Si desea usar el objeto con tipografía después de la verificación:
Desde C # 7.0:
Esto es lo mismo que
Consulte Documentos de .NET: coincidencia de patrones con
is
# Tipo de patrónfuente
Una variación de la respuesta de @ AndrewKennan que terminé usando recientemente para los tipos obtenidos en tiempo de ejecución:
fuente
Esta publicación es una buena respuesta.
Esta es una muestra simple:
o
fuente
Además de probar con el operador "es", puede decorar sus métodos para asegurarse de que las variables que se le pasen implementen una interfaz particular, de esta manera:
No estoy seguro de qué versión de .Net se implementó, por lo que es posible que no funcione en su versión.
fuente
Lo que funcionó para mí es:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
fuente
Recientemente intenté usar la respuesta de Andrew Kennan y no me funcionó por alguna razón. Utilicé esto en su lugar y funcionó (nota: podría ser necesario escribir el espacio de nombres).
fuente
solía
Assert.IsTrue(myObject is ImyInterface);
para una prueba en mi unidad de prueba que prueba que myObject es un objeto que ha implementado mi interfaz ImyInterface.
fuente
Tuve una situación en la que estaba pasando una variable a un método y no estaba seguro de si iba a ser una interfaz o un objeto.
Los objetivos fueron:
Lo logré con lo siguiente:
fuente
Esto debería funcionar :
Pero bueno también:
O incluso (no muy elegante):
fuente