Почему System.ComponentModel.DataAnnotations.DisplayAttribute запечатан? - PullRequest
3 голосов
/ 22 февраля 2012

Я собирался реализовать пользовательский DisplayAttribute, чтобы разрешить динамическое отображение значений на основе значений модели, но я не могу, потому что DisplayAttribute запечатан.

Прежде чем я уйду и напишу свойсобственный атрибут клиента, который имитирует поведение DisplayAttribute, кто-нибудь может подумать, почему это запечатано?Я предполагаю, что есть причина этого, и если так, то это может быть та же самая причина, по которой я не должен пытаться «взломать» это ограничение, прокручивая свое собственное.

Я никого не спрашиваючтобы прочесть мысли Microsoft, я просто надеюсь, что кто-то уже знает причину, по которой она запечатана, так что я могу принять это во внимание при развертывании (или исключении) моей собственной реализации.

Ответы [ 2 ]

7 голосов
/ 22 февраля 2012

В общем, считается наилучшей практикой запечатывать атрибуты. В FxCop есть правило, определенное здесь . С этой страницы:

Библиотека классов .NET Framework предоставляет методы для получения пользовательских атрибутов. По умолчанию эти методы выполняют поиск в иерархии наследования атрибутов; например Attribute.GetCustomAttribute ищет указанный тип атрибута или любой тип атрибута, который расширяет указанный тип атрибута. Запечатывание атрибута исключает поиск по иерархии наследования и может повысить производительность.

Многие из атрибутов MVC (ActionFilter и т. Д.) Незапечатаны, поскольку они специально предназначены для расширения, но элементы в пространстве имен DataAnnotations не являются.

0 голосов
/ 22 февраля 2012

Не совсем то, что вы просили, но в соответствии с вашими намерениями ...

Вы все еще можете разрешить динамические значения отображения, просто не расширяете DisplayAttribute.

Вместо этого вы можете реализовать свойсобственный IModelMetadataProvider, который может содержать любую логику, необходимую для создания значений динамического отображения.

Брэд Уилсон из команды ASP.NET MVC имеет хорошую статью и пример этого в своем блоге: http://bradwilson.typepad.com/blog/2010/01/why-you-dont-need-modelmetadataattributes.html

...