c# - una - Probar si el objeto implementa la interfaz
interfaces definida por c# (12)
¿Cuál es la forma más sencilla de probar si un objeto implementa una interfaz determinada en C #? (Respuesta a esta pregunta en Java )
Además de realizar pruebas utilizando el operador "es", puede decorar sus métodos para asegurarse de que las variables que se le pasan implementan una interfaz particular, como por ejemplo:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
No estoy seguro de en qué versión de .Net se implementó, por lo que es posible que no funcione en su versión.
El uso de is
o as
operadores 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 es Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Creo que esto es mucho mejor que mirar a través de la matriz devuelta por GetInterfaces
y tiene la ventaja de trabajar para las clases también.
Este Post es una buena respuesta.
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
Esta es una muestra simple:
public interface IMyInterface {}
public class MyType : IMyInterface {}
o
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
Esto debería funcionar :
MyInstace.GetType().GetInterfaces();
Pero bueno también:
if (obj is IMyInterface)
O incluso (no muy elegante):
if (obj.GetType() == typeof(IMyInterface))
Lo que funcionó para mí es:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
Por ejemplo:
if (obj is IMyInterface) {}
Para la clase:
Compruebe si typeof(MyClass).GetInterfaces()
contiene la interfaz.
Recientemente traté de usar la respuesta de Andrew Kennan y no funcionó por alguna razón. Utilicé esto en su lugar y funcionó (nota: podría ser necesario escribir el espacio de nombres).
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
Si desea utilizar el objeto tipificado después de la comprobación:
Desde C # 7.0:
if (obj is IMyInterface myObj)
Esto es lo mismo que
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Consulte .NET Docs: la coincidencia de patrones con # tipo patrón
Tuve una situación en la que pasaba una variable a un método y no estaba segura de si iba a ser una interfaz o un objeto.
Los objetivos fueron:
- Si el elemento es una interfaz, cree una instancia de un objeto basado en esa interfaz, siendo la interfaz un parámetro en la llamada del constructor.
- Si el elemento es un objeto, devuelva un nulo ya que el conductor de mis llamadas está esperando una interfaz y no quería que el código se acumulara.
Logré esto con lo siguiente:
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);
Una variación en la respuesta de @ AndrewKennan que terminé usando recientemente para los tipos obtenidos en el tiempo de ejecución:
if (serviceType.IsInstanceOfType(service))
{
// ''service'' does implement the ''serviceType'' type
}
solía
Assert.IsTrue(myObject is ImyInterface);
para una prueba en mi prueba de unidad que prueba que myObject es un objeto que ha implementado mi interfaz ImyInterface.
if (object is IBlah)
o
IBlah myTest = originalObject as IBlah
if (myTest != null)