在自动生成的视图中,我可以看到几行:
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.RestarauntName)
</th>
</tr>
我想写这样的东西:
<table>
@{
<th>
@typeof(Tutorial.Models.RestarauntReview).GetProperty("RestarauntName").Name
</th>
}
它也有效!
所以我的猜测是DisplayNameFor()方法使用反射来查找相应属性的名称。
这是我打破了我的想法。
使用反射的成本是多少?
对于我们想要快速渲染的较小视图,我们只需输入属性的名称吗? (硬编码?)
答案 0 :(得分:2)
所以我的猜测是DisplayNameFor()方法使用反射
我怀疑不是直接的。更有可能的是使用ModelMetaData(如果你遵循这条路线,毫无疑问最终会使用反射)。
对于我们想要快速渲染的较小视图,我们只需输入属性的名称吗?
你可以。对于一个相当小而且不变的项目来说可能没问题,但我不一定会推荐它。
使用反射的成本是多少?
我认为你会发现它对大多数用途来说都是微不足道的。除非它成为一个问题(鸭子,递归!),这是其中一个不关心的案例。
更大的担忧是:反思是实现目标的最佳途径吗?我认为这是你应该问的问题。反射非常有趣(我知道),但它也有点难以阅读,并且很难调试。这就是为什么如果有替代方案,最好避免它。在这种情况下,有: ModelMetaData 。
我的意思是:尝试使用HTML帮助,如果他们没有完全按照您的意愿行事,那么请尝试扩展它们并创建自己的。尝试爱上Display Templates and Editor Templates并将它们与ModelMetaData一起使用。
在Razor View中使用反射的问题在于你在视图中放错了东西。 Views should be stupid - 意思是他们不应该有任何逻辑,或者真的在做任何事情。您只需传递视图数据,它们就会为您显示。
我问了一些你可能感兴趣的(稍微相关的)问题Are HTML helpers worth using with complex markup?。