Sto guardando il componente MvcContrib Grid e sono affascinato, ma allo stesso tempo respinto, da un trucco sintattico usato nella sintassi Grid :
.Attributes(style => "width:100%")
La sintassi sopra imposta l'attributo di stile dell'HTML generato su width:100%
. Ora, se presti attenzione, lo "stile" non è specificato da nessuna parte. Viene dedotto dal nome del parametro nell'espressione! Ho dovuto scavare in questo e ho scoperto dove accade la 'magia':
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Quindi, in effetti, il codice utilizza il tempo formale di compilazione, il nome dei parametri per creare il dizionario delle coppie nome-valore dell'attributo. Il costrutto della sintassi risultante è davvero molto espressivo, ma allo stesso tempo molto pericoloso.
L'uso generale delle espressioni lambda consente la sostituzione dei nomi utilizzati senza effetti collaterali. Vedo un esempio in un libro che dice collection.ForEach(book => Fire.Burn(book))
che so di poter scrivere nel mio codice collection.ForEach(log => Fire.Burn(log))
e significa la stessa cosa . Ma con la sintassi della griglia MvcContrib qui all'improvviso, trovo codice che cerca attivamente e prende decisioni in base ai nomi che scelgo per le mie variabili!
Quindi è questa pratica comune con la comunità C # 3.5 / 4.0 e gli amanti delle espressioni lambda? O un ladro è un truffatore di cui non dovrei preoccuparmi?