2012-02-22 68 views
3

我打算实施一个自定义DisplayAttribute以便允许基于模型值的动态显示值,但是我不能,因为DisplayAttribute是密封的。为什么密封System.ComponentModel.DataAnnotations.DisplayAttribute?

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

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

回答

7

一般认为最好的做法是将属性加盖。 FxCop有一条规则,defined here。从该页开始:

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

许多MVC的属性(ActionFilter,等)的未密封,因为它们是专门设计来进行扩展,但在DataAnnotations命名空间的元素都没有。