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 => n.ProductName)
意思相同。它是一个一元匿名函数,返回其参数的 ProductName。
【讨论】:
那么 IDE 是如何知道将“n”或“m”链接到我的页面模型的?【参考方案6】:m => m.ProductName
是一个 lambda,表示一个 匿名方法,它接受一个名为 m
的参数。所以m
is 声明:就在 lambda 本身中。考虑到委托LabelFor
的类型作为参数,编译器应该可以推断出该类型。
【讨论】:
【参考方案7】:您已声明m
;您发布的是 lambda 语法(以表达式形式)。 =>
之前的部分是 lambda 的参数列表,=>
之后的部分是正文。
在您的情况下,您使用的是表达式 lambda。它是以下的简写:
@Html.LabelFor(m =>
return m.PropertyName;
);
无论如何,这里的m
参数代表一个传递给函数的值。
【讨论】:
以上是关于c#如何找出“m”从哪里来(m => m.SomeProperty)?的主要内容,如果未能解决你的问题,请参考以下文章