Como trabalhar com uma interface carregado dinamicamente a partir de uma montagem e invocar seus membros

StackOverflow https://stackoverflow.com/questions/280578

Pergunta

Eu tenho algum código para carregar um assembly e obter todos os tipos, que implementam uma determinada interface, como este (assumir asm é um válido e carregado de montagem).

var results = from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select type;

Agora eu estou preso: eu preciso para criar instâncias desses objetos e chamar métodos e propriedades no objeto. E eu preciso para armazenar as referências aos objetos criados em uma matriz para uso posterior.

Foi útil?

Solução

Oh wow - Eu só blog sobre este um alguns dias atrás. Aqui é o meu método para retornar instâncias de todos os tipos que implementam uma determinada interface:

private static IEnumerable<T> InstancesOf<T>() where T : class
{
    var type = typeof(T);
    return from t in type.Assembly.GetExportedTypes()
           where t.IsClass
               && type.IsAssignableFrom(t)
               && t.GetConstructor(new Type[0]) != null
           select (T)Activator.CreateInstance(t);
}

Se você refatorar isso para aceitar um parâmetro de montagem em vez de usar a interface da Assembleia, torna-se suficientemente flexível para atender sua necessidade.

Outras dicas

Você pode criar uma instância de um tipo com o método Activator.CreateInstance: -

IServiceJob x = Activator.CreateInstance(type);

Assim, o código torna-se: -

IServiceJob[] results = (from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select (IServiceJob)Activator.CreateInstance(type)).ToArray();

(Nota mudança var para IServiceJob [] para deixar claro o que está sendo criado).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top