Просто хотел выкинуть на мой взгляд (я автор компонента сетки MvcContrib).
Это определенно языковое злоупотребление - без сомнения. Тем не менее, я бы не стал считать это противоречащим интуиции - когда вы смотрите на вызов Attributes(style => "width:100%", @class => "foo")
Я думаю, что это довольно очевидно, что происходит (это, конечно, не хуже, чем подход анонимного типа). С точки зрения интеллигенции, я согласен, что это довольно непрозрачно.
Для тех, кто заинтересован, некоторая справочная информация о его использовании в MvcContrib ...
Я добавил это в таблицу как личное предпочтение - мне не нравится использование анонимных типов в качестве словарей (параметр, принимающий «объект», так же непрозрачен, как параметр, принимающий параметры Func []) и словарь инициализатор коллекции довольно многословен (я также не являюсь поклонником многословных беглых интерфейсов, например, необходимости связывать воедино множественные вызовы атрибута («style», «display: none»). Attribute («class», «foo») и т. д. )
Если бы C # имел менее подробный синтаксис для литералов словаря, то я бы не стал включать этот синтаксис в компонент сетки:)
Я также хочу отметить, что использование этого в MvcContrib совершенно необязательно - это методы расширения, которые обертывают перегрузки, которые вместо этого принимают IDictionary. Я думаю, что важно, чтобы, если вы предоставляете такой метод, вы также поддерживали более «нормальный» подход, например, для взаимодействия с другими языками.
Кроме того, кто-то упомянул «издержки на рефлексию», и я просто хотел отметить, что при таком подходе не так много служебной информации - не требуется никакого отражения во время выполнения или компиляции выражений (см. http://blog.bittercoder.com/PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx).