none
Tipos dinámicos com lambda RRS feed

  • Pergunta

  • Olá pessoal,

    Estou desenvolvendo uma aplicação e preciso de passar para uma lambda um tipo que seja dinâmico, o código é basicamente esse:

    var g = q.OrderByDescending(x => x.Vendas)
                    .AsQueryable().GroupBy(GetGroupKey<Rel_Lucratividade, int>("Nome")).Select(x => x.First());
    
    
    // tenho um metodo assim recebe o tipo de classe e o tipo de variável
    
    private static Expression<Func<T, TElement>> GetGroupKey<T, TElement>(string property)
            {
                var parameter = Expression.Parameter(typeof(Rel_Lucratividade));
                var body = Expression.Property(parameter, property);
                return Expression.Lambda<Func<T, TElement>>(body, parameter);
            }

    Meu problema está na hora de passar o TElement que pode ser um int, string, decimal, etc...

    Tentei pegar o tipo de forma dinâmica com algo próximo disso:

     Type TElement = typeof(Rel_Lucratividade).GetProperty("Nome")
                        .PropertyType.Name;
    
    var g = q.OrderByDescending(x => x.Vendas)
                    .AsQueryable().GroupBy(GetGroupKey<Rel_Lucratividade, TElement>(agrupar)).Select(x => x.First());

    Porem nao funcionou, parece que ele não reconhece o TElement como um tipo

    Alguém saberia me dizer como passar de forma dinâmica esse TElement em tempo de execução 



    Damon Abdiel

    sábado, 26 de março de 2016 19:55

Respostas

  • Bom dia Damon,

    Você precisa usar o GetType(), com exemplificado abaixo.

    Console.WriteLine(i.GetType() == typeof(int));

    Com ele é possível saber qual o tipo da variável que o elemento possui.


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ segunda-feira, 28 de março de 2016 14:14
    segunda-feira, 28 de março de 2016 13:11

Todas as Respostas

  • Olá Damon,

     poderia explicar um pouco do que gostaria, está meio confuso o método com a descrição do problema.

    domingo, 27 de março de 2016 01:09
  • É um relatório de vendas agrupado por grupos de produtos. Tem vários tipos de classificações dos produtos como classe, sub, grupo, família etc Estou fazendo uma query via linq com um groupby geralmente seria algo assim .GroupBy(x => x.Grupo)

    Como podemos ter varias classificações não queria ficar usando IF pra resolver o problema. Criado o método GetGroupKey que recebe uma string varre o objeto e retorna a expression com a classe por exemplo se quiser agrupar por grupo eu faço como no exemplo GetGroupKey("Grupo")

    Acontece que esse método GetGroupKey precisa de passar o tipo de campo que o Grupo é por exemplo se for int teria que ser GetGroupKey<NomeClasseProduto, int>("Grupo") se eu quisesse fazer groupby num campo de string usando esse método eu não conseguiria. Por isso quero passar o tipo de forma mais dinâmica. Não sei se ficou muito claro.


    Damon Abdiel


    domingo, 27 de março de 2016 16:06
  • Bom dia Damon,

    Você precisa usar o GetType(), com exemplificado abaixo.

    Console.WriteLine(i.GetType() == typeof(int));

    Com ele é possível saber qual o tipo da variável que o elemento possui.


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ segunda-feira, 28 de março de 2016 14:14
    segunda-feira, 28 de março de 2016 13:11