将参数传递给Func<>在MVC助手

时间:2014-04-27 18:50:52

标签: c# asp.net-mvc lambda delegates func

我有被盗从互联网上看到以下代码。方法标志是

public static MvcHtmlString RecordPager(this HtmlHelper html, PagingInfoModel pageInfo, Func<int,string> someUrl )

在View中调用它如下:

@Html.RecordPager(Model.PagingInfoModel, x => Url.Action("Index", new { page = x }) )

我的问题是特别关于最后一个参数,我不太明白你怎么能通过论证 x =&gt; Url.Action(&#34;索引&#34;,新{page = x})进入参数

Func<int,string> someUrl

我知道这是MVC&amp; HtmlHelper等的扩展方法,而Func&lt; int,string&gt;是一个委托期望 int 并返回字符串,但参数x =&gt;中的 int 在哪里? Url.Action等...

你可能已经聚集在一起我不了解lamba和linq以及匿名函数和所有现代爵士乐,但请为像我这样会遇到同样问题的假人提供一个不错的解释。感谢。

1 个答案:

答案 0 :(得分:1)

Func<int, string>基本上是具有以下签名的委托:

public delegate string Func(int I)

在C#2之前,将方法传递给委托(指向函数的指针)的唯一方法是显式创建一个与上面的委托具有相同签名的命名方法,如下所示:

public string MyAwsomeFunc(int I)

该方法可以传递给包含委托作为参数的方法:

public void SomeFunc(Func callback)

C#2引入了匿名方法,它使我们能够动态创建委托处理程序&#34;让编译器为我们创建命名方法:

// Create a delegate. 
delegate string Func(int x);

// Instantiate the delegate using an anonymous method.
Func d = delegate(int k) { /* ... */ };

C#3向我们介绍了 Lamba Expressions ,这是在C#中处理委托的首选方式。 lambda表达式是一种可用于创建委托的匿名方法。通过使用lambda表达式,您可以编写可以作为参数传递或作为函数调用的值返回的本地函数:

delegate int del(int i);

del myDelegate = x => x * x // lamba expression syntax
int j = myDelegate(5); //j = 25

您的方法中发生的事情是它接受委托类型Func<int, string>,并使用lamba表达式语法:

 x => Url.Action("Index", new { page = x }) )

x是Func的输入参数,它是一个int并被分配给page属性,而Url.Action方法返回一个字符串,这是返回类型的预期。编译器正在为我们生成委托处理程序,因此我们不必这样做。它与使用以下方法和命名方法相同:

string MyMethod(int I)
{
    string result = Url.Action("index", new { page = I });
    return result;
}

然后,将MyMethod作为参数发送:

@Html.RecordPager(Model.PagingIngModel, MyMethod(someInt));

修改

一些阅读材料: