usan una que programacion por las interfaz interfaces implementacion herencia definida declaracion como clase atributos abstracta c# reflection interface

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:

  1. 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.
  2. 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)