Отражение имени параметра: злоупотребление лямбда-выражениями C # или синтаксический блеск? - PullRequest
422 голосов
/ 12 ноября 2009

Я смотрю на компонент * Grid MvcContrib , и меня восхищает, но в то же время отталкивает синтаксический прием, используемый в синтаксисе 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 и любителей лямбда-выражений? Или мне не стоит беспокоиться о мошеннике-мошеннике?

Ответы [ 21 ]

1 голос
/ 07 декабря 2009

Я думаю, что это не лучше, чем "волшебные струны". Я не большой поклонник анонимных типов для этого. Это требует лучшего и строго типизированного подхода.

...