请解释为什么这个c#扩展方法有效

时间:2011-06-27 12:10:09

标签: c# asp.net-mvc asp.net-mvc-2

我买了pro asp.net mvc2框架书。我在第122页遇到了困难。我无法理解为什么会这样。

我已经通过电子邮件发送了作者,但还没有收到任何回复。这是代码,有人可以向我解释它为什么有效。

    public static class PagingHelpers
{
    public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int, string> pageUrl)
    {
        StringBuilder result = new StringBuilder();

        for (int i = 1; i <= pagingInfo.TotalPages; i++)
        {
            TagBuilder tag = new TagBuilder("a");
            tag.MergeAttribute("href", pageUrl(i));

            tag.InnerHtml = i.ToString();

            if (i == pagingInfo.CurrentPage)
                tag.AddCssClass("selected");

            result.AppendLine(tag.ToString());
        }

        return MvcHtmlString.Create(result.ToString());
    }
}

这个PageLinks辅助方法需要3个参数,但在本书后面,当作者调用它时,

<%: Html.PageLinks(
      new PagingInfo { CurrentPage = 2, TotalItems = 28, ItemsPerPage = 10 },
      i => Url.Action("List", new{ page = i})
) %>

作者只传递了2个参数,HtmlHelper html丢失了,但是它有效。我无法弄清楚原因,请帮助,谢谢。

3 个答案:

答案 0 :(得分:7)

扩展方法的第一个参数是它被调用的对象。 (示例中为Html)。

您可以阅读more about extension methods on MSDN

答案 1 :(得分:1)

扩展方法与其他方法的不同之处在于它们是

  • 声明为静态
  • 第一个参数是名为
  • 的对象
  • 第一个参数以this关键字
  • 为前缀

可以在此处找到进一步的讨论:http://msdn.microsoft.com/en-us/library/bb383977.aspx

答案 2 :(得分:0)

由于第一个参数定义为&lt; 类型名称&gt;与通常情况相反,编译器知道以自动处理第一个参数的方式构建它,因此您只需要担心这些参数,如果有的话。