理解Func用MVC委托
本文关键字:MVC 委托 result Func 理解 | 更新日期: 2023-09-27 17:49:02
我正试着把我的头绕在Func <T,结果>委托,但似乎我不清楚。我知道T是参数&结果为返回类型。
在MVC中,我一直使用这个函数:
@model Products
@Html.TextBoxFor(s=>s.my_property)
现在TextBoxFor函数如何知道传递给我的参数实际上是一个"Products Model"。
下面是TextBoxFor Model的签名:
public static MvcHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IDictionary<string, Object> htmlAttributes
)
所以我的问题是,当我调用Html.TextBoxFor(s),那么怎么来这个方法知道"s"是一个"产品"模型和TModel如何映射到参数"s"(知道它的产品模型和我需要返回的东西)?
由于@model Products
指令,Html
属性(@Html
)属于HtmlHelper<Products>
类型。这就是Razor引擎的工作原理。
TextBoxFor
是HtmlHelper<TModel>
的扩展方法,在您的代码中,您在HtmlHelper<Products>
的实例上调用它,因此TModel
被解析为Products
。
TProperty
绑定到my_property
的类型,因为它知道TModel
是什么,并且可以推断出lambda "返回"的内容。旁注:你必须知道
Expression<Func<T>>
与Func<T>
:完全不同。-
Func<...>
只是一个简单的委托,对某处可执行代码的引用,这是不透明的。 -
Expression<Func<...>>
是表达式树,是AST的一种。
当你写一个lambda时,编译器生成不同的代码取决于你是将lambda分配给Func<...>
还是Expression<Func<...>>
。在第一种情况下,它将编译lambda并生成一个委托。在第二种情况下,它将发出一个表达式树。
要了解更深入的解释,您可以阅读Eric Lippert的Lambda表达式与匿名方法系列文章:第1、2、3、4、5部分