c#如何找出“m”从哪里来(m => m.SomeProperty)?

Posted

技术标签:

【中文标题】c#如何找出“m”从哪里来(m => m.SomeProperty)?【英文标题】:How does c# figure out where "m" comes from in (m => m.SomeProperty)? 【发布时间】:2011-05-23 12:19:54 【问题描述】:

例如,在一个 MVC 应用程序中,我可以使用 html 助手来创建这样的标签:

@Html.LabelFor(m => m.ProductName)

我没有在任何地方声明变量“m”,但是 IDE 会自动找出我想要做什么。 IDE 比我更了解我的代码,这有点令人不安。我想解决这个问题。

我主要想知道它是如何知道如何引用我的模型的。

编辑:感谢所有答案。

因此,“Html”是 HtmlHelper 的一个实例。 “Html”是 ViewPage 基类的成员。它的值在 ViewPage 基类的 InitHelpers() 方法中设置。 HtmlHelper 构造函数将 ViewPage 的 ViewContext 作为参数。 ViewContext 知道我使用的是什么模型。 LabelFor 是 HtmlHelper 类的扩展方法。这就是为什么 lambda 表达式知道如何引用我的模型。

点是相连的。谢谢!

【问题讨论】:

看看this blog post by ScottGu 【参考方案1】:

您需要阅读 lambda,但实际情况是您将函数指针传递给 LabelFor 方法。因为Html 是强类型(HtmlHelper<TYourModelType>)并且LabelFor 被声明为Func<TYourModelType, TValue>,所以编译器(和IDE)可以确定m 是您的模型类型的一个实例,因此提供了不错的IDE 下拉菜单为会员。

有时人们发现比较您可以使用的其他语法选项很有帮助。例如,这同样有效:

Html.LabelFor(SomePropertyMethod);

...

string SomePropertyMethod(TYourModelType model) 

    return model.SomeProperty;

【讨论】:

所以在幕后,ASP.NET MVC 创建了 Html 对象,如“HtmlHelper Html = New HtmlHelper(ProductModel)”,所以当我调用 Html.[whatever] 时,它使用对我的引用模型。然后它使用 LabelFor 辅助方法。正确的?我想我假设 Html 是一个带有静态方法的类,例如 LabelFor。 @Jim,这非常正确。准确地说,HtmlHelper 本身并没有很多方法。但是为HtmlHelper 定义了 的扩展方法(this HtmlHelper<TModel>)。在这种情况下,LabelFor 实际上是在 System.Web.Mvc.LabelExtensions 中定义的——一个包含扩展 HtmlHelper 类的静态方法的静态类。【参考方案2】:

这是针对您在顶部的视图声明的。

 <%@ Page Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.EntryForm1>" %>

所以你的表单继承自 ViewPage 并且它会理解 T 是什么类型。

【讨论】:

告诉我吧!感谢+1。我今天没能提出任何观点:)【参考方案3】:

LabelFor 的泛型参数与您的模型类型相同:

Inherits="System.Web.Mvc.ViewPage<MyModel>"

LabelFor 的参数类型为:

Expression<Func<MyModel,TValue>>

因此编译器知道您将把 MyModel 对象传递给 lambda。

【讨论】:

【参考方案4】:

显然,LabelFor 接受一个签名只有一个参数的委托。 IDE 看到这一点并基于该类型 m 具有与参数相同的数据类型。

【讨论】:

【参考方案5】:

m 这个名字不代表任何东西。 @Html.LabelFor(n =&gt; n.ProductName) 意思相同。它是一个一元匿名函数,返回其参数的 ProductName。

【讨论】:

那么 IDE 是如何知道将“n”或“m”链接到我的页面模型的?【参考方案6】:

m =&gt; m.ProductName 是一个 lambda,表示一个 匿名方法,它接受一个名为 m 的参数。所以m is 声明:就在 lambda 本身中。考虑到委托LabelFor 的类型作为参数,编译器应该可以推断出该类型。

【讨论】:

【参考方案7】:

您已声明m;您发布的是 lambda 语法(以表达式形式)。 =&gt; 之前的部分是 lambda 的参数列表,=&gt; 之后的部分是正文。

在您的情况下,您使用的是表达式 lambda。它是以下的简写:

@Html.LabelFor(m =>

    return m.PropertyName;
);

无论如何,这里的m参数代表一个传递给函数的值。

【讨论】:

以上是关于c#如何找出“m”从哪里来(m => m.SomeProperty)?的主要内容,如果未能解决你的问题,请参考以下文章

ASPasswordCredential - 从哪里来?

控制台窗口如何在内部处理 JavaScript 算术赋值?返回值从哪里来?

我的创业你也可以复制:启动资金从哪里来?

不知道中的知道----信息从哪里来

云原生是什么?它从哪里来?又到哪里去?

虫从哪里来绘本