让我们通过检查方法签名来分解它:
MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
这是使用扩展方法语法,这意味着它添加了一个名为EditorFor
to的方法HtmlHelper
,以便您可以进行调用Html.EditorFor
。但我们真正感兴趣的是第二个参数Expression<Func<TModel, TValue>>
. 这是一个相当复杂的参数,但现在我们可以忽略它是一个Expression
. 所以简化,让我们检查一下:
Func<TModel, TValue> expression
这意味着参数是具有一个参数(类型为)且返回类型为的任何方法。您一直在使用 lambda,它(本质上)是一种更简洁的方法表示,但将其视为普通方法会很有帮助。所以你是 lambda 正在接受一个模型并返回一个模型:TModel
TValue
m => m
这不是很有趣,所以让我们将它与一个更现实的场景进行比较,在这个场景中,您要从模型中返回一个属性:
m => m.MyStringProperty
现在让我们将它与您在某处声明的普通静态方法进行比较:
public static class MyStaticClass
{
public static string Foo(TModel model)
{
return model.MyStringProperty;
}
}
虽然真的在这里它不会TModel
- 它会是你通过声明你的模型类型的任何东西@model
。现在,为了讨论,您可以在调用时使用此方法EditorFor
:
Html.EditorFor(MyStaticClass.Foo);
总而言之,lambdas(在大多数情况下)只是常规方法的简写。所以你所做的就是传递方法。
最后要注意的是,我们实际上是在使用表达式树,这意味着您实际上并没有传递方法,而是传递了表示方法代码的对象模型(表达式树)。本质上,这只是用来确定您正在使用的属性名称(因为通常 lambda 更像m => m.MyProperty
,而不仅仅是m => m
)。这一切都是为了避免使用字符串(即“MyProperty”)引用属性名称的魔术字符串。