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());
        }