Pergunta

Usando reflexão no .NET, qual é a diferença entre:

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

E

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

O que é mais apropriado, por quê?

Quando um ou outro poderia falhar?

Foi útil?

Solução

Se você deseja apenas ver se um tipo implementa uma determinada interface, ou é bom, embora o getInterface () seja provavelmente mais rápido, pois o isassignablefrom () faz mais verificações internas do que getInterface (). Provavelmente, ainda mais rápido verificar os resultados do tipo.getInterfaces () que retornam a mesma lista interna que os outros métodos usam de qualquer maneira.

Outras dicas

Há uma diferença na forma como as classes internas são tratadas. Faça a seguinte aula:

public interface IFoo
{
}    

internal class Foo: IFoo
{
}

Isso lhe dará uma lista de um item:

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

Considerando que isso lhe dará uma lista vazia:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.IsAssignableFrom(typeof(IFoo))
            .ToList();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top