理解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"(知道它的产品模型和我需要返回的东西)?

理解Func<T, result >用MVC委托

由于@model Products指令,Html属性(@Html)属于HtmlHelper<Products>类型。这就是Razor引擎的工作原理。

TextBoxForHtmlHelper<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部分