Я смотрю MvcContrib Grid-компонент, и я очарован, но в то же время отталкивается синтаксическим трюком, используемым в Синтаксис сетки:
.Attributes(style => "width:100%")
Синтаксис выше устанавливает атрибут стиля сгенерированного HTML в width:100%
. Теперь, если вы обратите внимание, "стиль" нигде не указан, выводится из name параметра в выражении! Я должен был вникать в это и обнаружил, где происходит "волшебство":
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 здесь внезапно я нахожу код, который активно смотрит и принимает решения на основе имен, которые я выбираю для своих переменных!
Итак, это распространенная практика с сообществом С# 3.5/4.0 и любовниками лямбда-выражения? Или это трюк-трюк-мошенник, о котором я не должен беспокоиться?