private static IQueryable <object> ProjetarDeFormaDinamicaSelecionada <T>( this IQueryable <T> consulta, string[] campos, out MapperConfiguration configuracoesDeMapeamento) { var descricoes = new DnDescricaoDaClasse(typeof(T), campos); var id = UtilitarioDeRandomico.ObterString(6); var nomeDaDll = $"DnDll_{id}"; var tipo = descricoes.CriarOTipo(nomeDaDll); var tipos = new List <Tuple <Type, Type> >(); descricoes.ObterTodosOsTiposPorDescricao(tipos); configuracoesDeMapeamento = new MapperConfiguration( cfg => { cfg.CreateMap(typeof(T), typeof(T)); cfg.CreateMap(typeof(T), tipo).ReverseMap(); tipos.ForEach(x => cfg.CreateMap(x.Item1, x.Item2).ReverseMap()); }); var metodo = typeof(Extensions).GetMethods() .Where(x => x.Name == nameof(Extensions.ProjectTo)) .ToList()[2].MakeGenericMethod(tipo);//Todo - Isso deve ser revisto, há uma chance de problemas futuros aqui var ret = metodo.Invoke( null, new object[] { consulta, configuracoesDeMapeamento, null, campos.Select(x => x).ToArray() }); return(ret as IQueryable <object>); }
internal static void ObterTodosOsTiposPorDescricao(this DnDescricaoDaClasse descricao, List <Tuple <Type, Type> > tipos) { var descricoes = descricao.Propriedades.Where(propriedade => propriedade.DescricaoDaClasse != null); foreach (var propriedade in descricoes) { tipos.Add(new Tuple <Type, Type>(propriedade.Tipo, propriedade.TipoDaPropriedadeDinamica)); ObterTodosOsTiposPorDescricao(propriedade.DescricaoDaClasse, tipos); } }
internal static Type CriarOTipo(this DnDescricaoDaClasse descricao, string nomeDaDll) { var construtorPrincipal = CriarTipo(nomeDaDll); foreach (var propriedade in descricao.Propriedades) { if (propriedade.DescricaoDaClasse != null) { propriedade.TipoDaPropriedadeDinamica = CriarOTipo(propriedade.DescricaoDaClasse, nomeDaDll); construtorPrincipal.CreateProperty(propriedade.Nome, propriedade.TipoDaPropriedadeDinamica); } else { construtorPrincipal.CreateProperty(propriedade.Nome, propriedade.Tipo); } } return(construtorPrincipal.CreateType()); }