首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在(m => m.SomeProperty)中,c#是如何找出"m“的来源的?

在(m => m.SomeProperty)中,c#是如何找出"m“的来源的?
EN

Stack Overflow用户
提问于 2010-12-10 22:08:53
回答 7查看 392关注 0票数 4

例如,在MVC应用程序中,我可以使用Html助手创建如下标签:

代码语言:javascript
复制
@Html.LabelFor(m => m.ProductName)

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

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

编辑:感谢所有的答案。

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

点是连在一起的。谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-10 22:12:33

您需要通读lambdas,但实际情况是,您传入了一个指向LabelFor方法的函数指针。因为Html是强类型的(HtmlHelper<TYourModelType>),并且LabelFor是像Func<TYourModelType, TValue>一样声明的,所以编译器(和集成开发环境)可以确定m是模型类型的实例,因此为成员提供了很好的集成开发环境下拉列表。

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

代码语言:javascript
复制
Html.LabelFor(SomePropertyMethod);

...

string SomePropertyMethod(TYourModelType model) 
{
    return model.SomeProperty;
}
票数 12
EN

Stack Overflow用户

发布于 2010-12-10 22:12:22

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

代码语言:javascript
复制
 <%@ Page Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.EntryForm1>" %>

因此,您的表单继承自ViewPage,它将理解T类型是什么。

票数 1
EN

Stack Overflow用户

发布于 2010-12-10 22:14:20

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

代码语言:javascript
复制
Inherits="System.Web.Mvc.ViewPage<MyModel>"

LabelFor的参数类型为:

代码语言:javascript
复制
Expression<Func<MyModel,TValue>>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4409566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档