Я смотрю на компонент MvcContrib Grid, и меня восхищает, но в то же время отталкивает синтаксический прием, используемый в синтаксисе Grid :
.Attributes(style => "width:100%")
Синтаксис выше устанавливает атрибут стиля сгенерированного HTML в width:100%
. Теперь, если вы обратите внимание, «стиль» нигде не указан. Это выводится из имени параметра в выражении! Я должен был покопаться в этом и найти, где происходит «волшебство»:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
Таким образом, код использует формальное время компиляции, имя параметров для создания словаря пар имя-значение атрибута. Полученная синтаксическая конструкция действительно очень выразительна, но в то же время очень опасна.
Общее использование лямбда-выражений позволяет заменять имена, используемые без побочных эффектов. Я вижу пример в книге, который говорит, что collection.ForEach(book => Fire.Burn(book))
я знаю, что могу написать в своем коде, collection.ForEach(log => Fire.Burn(log))
и это означает то же самое . Но с синтаксисом MvcContrib Grid здесь я неожиданно обнаружил код, который активно просматривает и принимает решения на основе имен, выбранных для моих переменных!
Так это обычная практика с сообществом C # 3.5 / 4.0 и любителями лямбда-выражений? Или мне не стоит беспокоиться о мошенниках?