1

在自动生成的视图中,我可以看到如下几行:

<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.RestarauntName)
    </th>
</tr>

我想写这样的东西:

<table>
@{
            <th>
                 @typeof(Tutorial.Models.RestarauntReview).GetProperty("RestarauntName").Name
             </th>
        }

它也有效!

所以我的猜测是 DisplayNameFor() 方法使用反射来查找相应属性的名称。

这是我头疼的事情。

  1. 使用反射的成本是多少?

  2. 对于我们想要快速渲染的较小视图,我们可以只输入属性的名称吗?(硬编码?)

4

1 回答 1

2

所以我的猜测是 DisplayNameFor() 方法使用反射

不是直接的,我怀疑。更有可能是使用ModelMetaData(如果您遵循线索,毫无疑问最终会使用反射)。

对于我们想要快速渲染的较小视图,我们可以只输入属性的名称吗?

你可以。对于一个相当小且不变的项目来说可能没问题,但我不一定会推荐它。

使用反射的成本是多少?

我想你会发现它对于大多数用途来说是微不足道的。这是其中一种情况,除非它成为一个问题(鸭子,递归!),否则它不是一个问题。

更大的担忧是:反思是实现目标的最佳方式吗?我认为这是你应该问的问题。反射很有趣(我知道),但它也有点难以阅读并且难以调试。这就是为什么如果有替代方案最好避免它。在这种情况下,有:ModelMetaData

我的意思是:一定要尝试使用 HTML Helpers,如果他们没有完全按照您的意愿进行操作,请尝试扩展它们并创建您自己的。尝试爱上显示模板和编辑器模板并将它们与 ModelMetaData 结合使用。

在 Razor 视图中使用反射的问题是您在视图中放置了错误的东西。视图应该是愚蠢的——这意味着它们不应该有任何逻辑,或者真的“做很多”任何事情。您只需传递视图数据,它们就会为您显示。

我问了(稍微相关的)问题HTML 助手值得与复杂标记一起使用吗?你可能会觉得有趣。

于 2013-09-20T05:33:14.777 回答