Je regarde le composant MvcContrib Grid et je suis fasciné, mais en même temps repoussé, par une astuce syntaxique utilisée dans la syntaxe Grid :
.Attributes(style => "width:100%")
La syntaxe ci-dessus définit l'attribut style du code HTML généré sur width:100%
. Maintenant, si vous faites attention, le «style» n'est spécifié nulle part. Il est déduit du nom du paramètre dans l'expression! J'ai dû creuser cela et j'ai trouvé où la «magie» se produisait:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Donc, en effet, le code utilise le nom formel de l'heure de compilation des paramètres pour créer le dictionnaire des paires nom-valeur d'attribut. La construction de syntaxe résultante est certes très expressive, mais en même temps très dangereuse.
L'utilisation générale des expressions lambda permet de remplacer les noms utilisés sans effet secondaire. Je vois un exemple dans un livre qui dit que collection.ForEach(book => Fire.Burn(book))
je sais que je peux écrire dans mon code collection.ForEach(log => Fire.Burn(log))
et cela signifie la même chose . Mais avec la syntaxe de la grille MvcContrib ici, tout d'un coup, je trouve du code qui regarde activement et prend des décisions en fonction des noms que je choisis pour mes variables!
Est-ce donc une pratique courante avec la communauté C # 3.5 / 4.0 et les amoureux des expressions lambda? Ou est-ce un franc-tireur un truc dont je ne devrais pas m'inquiéter?