Pregunta

Usando la reflexión en .Net, ¿cuál es la diferencia entre:

   if (foo.IsAssignableFrom(typeof(IBar)))

Y

   if (foo.GetInterface(typeof(IBar).FullName) != null)

¿Cuál es más apropiado y por qué?

¿Cuándo podría fracasar uno u otro?

¿Fue útil?

Solución

Si solo desea ver si un tipo implementa una interfaz determinada, cualquiera de las dos opciones está bien, aunque GetInterface() es probablemente más rápido ya que IsAssignableFrom() realiza más comprobaciones internas que GetInterface().Probablemente sea aún más rápido verificar los resultados de Type.GetInterfaces() que devuelve la misma lista interna que los otros dos métodos usan de todos modos.

Otros consejos

Hay una diferencia en cómo se manejan las clases internas.Toma la siguiente clase:

public interface IFoo
{
}    

internal class Foo: IFoo
{
}

Esto le dará una lista de un elemento:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.GetInterface(typeof(IFoo).FullName) != null)
            .ToList();

Mientras que esto le dará una lista vacía:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.IsAssignableFrom(typeof(IFoo))
            .ToList();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top