Estoy mirando el componente MvcContrib Grid y estoy fascinado, pero al mismo tiempo rechazado, por un truco sintáctico utilizado en la sintaxis de Grid :
.Attributes(style => "width:100%")
La sintaxis anterior establece el atributo de estilo del HTML generado en width:100%
. Ahora, si prestas atención, 'estilo' no se especifica en ninguna parte. Se deduce del nombre del parámetro en la expresión! Tuve que profundizar en esto y descubrí dónde sucede la 'magia':
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
De hecho, el código está usando el tiempo formal de compilación, el nombre de los parámetros para crear el diccionario de pares de nombre-valor de atributo. La construcción de sintaxis resultante es muy expresiva, pero al mismo tiempo muy peligrosa.
El uso general de las expresiones lambda permite el reemplazo de los nombres utilizados sin efectos secundarios. Veo un ejemplo en un libro que dice collection.ForEach(book => Fire.Burn(book))
que sé que puedo escribir en mi código collection.ForEach(log => Fire.Burn(log))
y significa lo mismo . ¡Pero con la sintaxis de MvcContrib Grid aquí de repente, encuentro un código que busca activamente y toma decisiones basadas en los nombres que elijo para mis variables!
Entonces, ¿es esta práctica común con la comunidad C # 3.5 / 4.0 y los amantes de las expresiones lambda? ¿O es un pícaro truco inconformista del que no debería preocuparme?