Qual é a diferença entre, isassignablefrom e getInterface?
-
01-07-2019 - |
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?
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