我有被盗从互联网上看到以下代码。方法标志是
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以及匿名函数和所有现代爵士乐,但请为像我这样会遇到同样问题的假人提供一个不错的解释。感谢。
答案 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));
修改强>
一些阅读材料: