É, parece que eu substimei o poder das “expressões lambda“, não que eu achasse que era um recurso ruim ou dispensável, mas cometi o erro gravíssimo de achar que esse recurso consistia apenas numa forma simplificada de se escrever um “delegate anônimo“, recurso que utilizo bastante, muito prático e deixa o código clean quando se precisa de algo simples e rápido.

Mas vocês sabiam que existe uma diferença nas duas linhas de codigo abaixo?

param1 => { return param1.someProperty == someValue; }
param1 => param1.someProperty == someValue

Ambas as linhas de código podem ser usadas como um método que recebe um parâmetro e retorna um valor booleano como resultado. E vocês podem estar se perguntando: “Se as duas podem ser usadas da mesma forma, então o que esse maluco está falando tanto em poder das lambda expressions?”, a resposta é simples e está debaixo do nasmepace System.Linq.Expressions, a primeira linha mostrada acima não pode virar uma Expression Tree, e o que isso quer dizer? Simples, uma Expression é uma classe que possui todas as informações disponíveis sobre a expressão que você montou, ou seja, olhando nós sabemos que a expressão exemplo do exemplo que dei é uma operação binária de igualdade senda aplicada sobre 2 operandos, o da esquerda (param1.someProperty) e o da direita (someValue). Vocês podem falar: “Tá, olhando é fácil deduzir isso, quero ver mostrar o código retornando essas informações”:

Expression<Func<SomeClass, Boolean>> a = param1 => param1.someProperty == someValue;
Console.WriteLine((a.Body as BinaryExpression).Left);
Console.WriteLine((a.Body as BinaryExpression).Method);
Console.WriteLine((a.Body as BinaryExpression).Right);

Com isso eu só deduzo uma coisa, esse recurso é EXTREMAMENTE flexível. É possível inventar basicamente o que quiser onde o uso de expressões sejam o forte, e com essas informações detalhadas sobre cada expressão é possível traduzir isso para qualquer outra coisa, não é à toa que o Linq é baseado nesse recurso das Expressions Trees, o Lambda torna o código muito sucinto e com todas as vantagens das checagens em compile time.

Agora fiquei eufórico de estudar isso a fundo e fazer um artigo sobre Expressions Trees, mas vou primeiro pesquisar na web para ver se já não tem muito material por aí, se eu achar que vale a pena fazer podem esperar.

Vou deixar só uma pergunta no ar: “Se de uma Lambda Expression é possível pegar a Expression Tree, o que vocês achariam de gerar um Lambda através de Expressões?”

Que isso mané? esse C# tá demais, só me surpreende…