为什么System.ComponentModel.DataAnnotations.DisplayAttribute已密封?

时间:2012-02-22 19:32:53

标签: asp.net-mvc asp.net-mvc-3 data-annotations

我打算实现自定义DisplayAttribute以允许基于模型值的动态显示值,但我不能因为DisplayAttribute被密封。

在我开始编写我自己的客户属性以模仿DisplayAttribute的行为之前,有人能想到为什么这是密封的吗?我假设背后有一个原因,如果是这样的话,这可能是我不应该试图通过滚动自己来“破解”这个限制的原因。

我不是要求任何人阅读微软的想法,我只是希望有人已经知道密封的设计理由,以便在滚动(或避免)我自己的实现时考虑到这一点。

2 个答案:

答案 0 :(得分:7)

一般来说,密封属性被认为是最佳做法。 FxCop有一个关于它的规则,defined here。从该页面:

  

.NET Framework类库提供了检索自定义属性的方法。默认情况下,这些方法搜索属性继承层次结构;例如,Attribute.GetCustomAttribute搜索指定的属性类型或扩展指定属性类型的任何属性类型。密封属性消除了通过继承层次结构的搜索,并且可以提高性能。

许多MVC属性(ActionFilter等)都是未密封的,因为它们专门设计用于扩展,但DataAnnotations命名空间中的元素不是。

答案 1 :(得分:0)

不完全是你问的,但是按照你的意图...

您仍然可以允许动态显示值,您只是不会扩展DisplayAttribute。

相反,您可以实现自己的IModelMetadataProvider,它可以包含创建动态显示值所需的任何逻辑。

来自ASP.NET MVC团队的Brad Wilson在他的博客上有一篇很好的文章和样本:http://bradwilson.typepad.com/blog/2010/01/why-you-dont-need-modelmetadataattributes.html