Criando instancia dinâmica para tipo Genérico (Generic Type Parameters) (pt-BR)

Criando instancia dinâmica para tipo Genérico (Generic Type Parameters) (pt-BR)

Uma vez tive um problema para se criar uma instancia dinamicamente de um tipo genérico o problema e que este tipo ele e informado via parâmetro dentro de um laço ou mesmo em uma assinatura de método que não pode utilizar o genérico. uma implementação pratica disso e a seguinte:
Suponhamos que temos uma classe generica repository com o método Save.
 1: public class Repository<T> where TSource : new()
 2: {
 3:     public void Save(T entity)
 4:     {
 5:     }
 6: }
Então para se utilizar o método Salvar(), por exemplo um objeto pessoa faz o seguinte:
 1: new Repository<Pessoa>().Save(pessoa)
Mas levando para o seguinte cenário, quando este método fosse consumido por uma outra classe onde a entidade de origem não tem seu tipo definido como a classe abaixo:
 1: public class Service
 2: {
 3:     public void Save(Object entity)
 4:     {       new Repository<???
 5:     }
 6: }
Uma forma para se contornar isso e instanciar o objeto dinamicamente:
 1: public class Service
 2: {
 3:     public void Save(Object entity)
 4:     {
 5:       Type type = entity.GetType()
 6:       var repository = Activator.CreateInstance(typeof (Repository<>).MakeGenericType(type));
 8:
 9:       repository
 10:             .GetMethod("Save", new Type[] { type})
 11:             .Invoke(repository, new object[] { entity});
 12:     }
 13: }
Assim com um único serviço pode utilizar varios objetos.
Leave a Comment
  • Please add 5 and 2 and type the answer here:
  • Post
Wiki - Revision Comment List(Revision Comment)
Sort by: Published Date | Most Recent | Most Useful
Comments
  • Fernando Lugão Veltem edited Original. Comment: alterado título para padronização e adicionado TAG

Page 1 of 1 (1 items)
Wikis - Comment List
Sort by: Published Date | Most Recent | Most Useful
Posting comments is temporarily disabled until 10:00am PST on Saturday, December 14th. Thank you for your patience.
Comments
  • Fernando Lugão Veltem edited Original. Comment: alterado título para padronização e adicionado TAG

  • Parabéns pelo artigo Alexis.

    Muito bom.

Page 1 of 1 (2 items)