Estou olhando para o componente MvcContrib Grid e estou fascinado, mas ao mesmo tempo repelido, por um truque sintático usado na sintaxe Grid :
.Attributes(style => "width:100%")
A sintaxe acima define o atributo de estilo do HTML gerado para width:100%
. Agora, se você prestar atenção, 'estilo' não é especificado em nenhum lugar. É deduzido do nome do parâmetro na expressão! Eu tive que cavar isso e descobri onde a 'mágica' acontece:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Portanto, de fato, o código está usando o nome formal dos parâmetros em tempo de compilação para criar o dicionário de pares nome-valor do atributo. A construção da sintaxe resultante é realmente muito expressiva, mas ao mesmo tempo muito perigosa.
O uso geral de expressões lambda permite a substituição dos nomes usados sem efeito colateral. Vejo um exemplo em um livro que diz collection.ForEach(book => Fire.Burn(book))
que sei que posso escrever no meu código collection.ForEach(log => Fire.Burn(log))
e que significa a mesma coisa . Mas com a sintaxe MvcContrib Grid aqui, de repente, encontro código que olha ativamente e toma decisões com base nos nomes que escolho para minhas variáveis!
Então, essa prática comum é com a comunidade C # 3.5 / 4.0 e os amantes de expressões lambda? Ou é um especialista em truques desonestos com o qual não devo me preocupar?